RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
Linux  2006/09/08 14:08
출처 블로그 > 폴라리스
원본 http://blog.naver.com/neodays/20015930776
데이터 파일을 sync하기 위한 rsync를 주로 사용하는데, 다음과 같은 경우를 생각해보자.

- 서버의 중요 설정 파일을 백업할 서버(백업 서버 1)가 별도로 있고, rsync daemon이 돌고 있다.
- 각 서버의 중요 파일은 백업 서버 1로 sync된다. 따라서 모든 서버의 설정 파일이 백업 서버 1에 있게된다.
- 그러나 백업 서버 1을 통해서 A라는 서버에서 B서버의 환경 파일을 sync로 받아갈 수 있다.

이런 경우 좀 더 나은 보안 설정을 위해 백업 서버 1으로 백업된 다른 파일을 받아갈 수 없도록 해야 한다.
rsync 2.6.3부터 추가된 write only 옵션으로 가능하다.

다음은 rsyncd.conf 파일이다.

-------------------------------------------------------------------------
[backup_dir]
uid             = root
gid             = wheel
path            = /data/BACKUP
comment         = data backup
read only       = no
write only      = yes

-------------------------------------------------------------------------

* 192.168.2.123 로 config.tar.gz를 백업할 때

-------------------------------------------------------------------------
# rsync -av config.tar.gz 192.168.2.123::backup_dir
building file list ... done
config.tar.gz
wrote 131 bytes  read 56 bytes  374.00 bytes/sec
total size is 3  speedup is 0.02
-------------------------------------------------------------------------


* 192.168.2.123 에 백업된 다른 서버의 설정파일 B_config.tar.gz를 받아올 때

-------------------------------------------------------------------------
# rsync -av  192.168.2.123::backup_dir B_config.tar.gz
receiving file list ... ERROR: module is write only
rsync error: syntax or usage error (code 1) at main.c(414)
rsync: connection unexpectedly closed (28 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(165)
-------------------------------------------------------------------------

* 관련글

- Rsync를 이용한 데이터 미러링 구축 (글 굿스피드)
  http://coffeenix.net/board_view.php?cata_code=61&bd_code=166

- 자료를 다른 파티션으로 그대로 백업(rsync이용, 글 좋은진호)
  http://coffeenix.net/board_view.php?cata_code=0&bd_code=88
2006/09/08 14:08 2006/09/08 14:08
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 14:07
출처 블로그 > 폴라리스
원본 http://blog.naver.com/neodays/20015909378
1. 실행 파일
아래의 소스를 복사해서 lbup 파일로 /usr/local/bin같은 곳에다 만듭니다.
(퍼미션은 적당히...)

2. 백업 프로파일 만들기
"/usr/local/backup/lbup"이라는 디랙토리를 만들고 여기에 일/주/월 백업 목록을 만듭니다.
daily.prof
weekly.prof
monthly.prof
(백업 프로파일을 만들때 줄 처음의 '#'은 코맨트 입니다.)
백업 대상이 파일인 경우는 파일명까지 디랙토리인 경우는 디랙토리까지 넣어줍니다.(너무 당연한가?)

3. 크론등록
전 크론에 등록해 놓고 씁니다만 이 부분은 알아서들 하시길


4. 작성된 압축파일들은 lbup 디랙토리에 저장되고 이전의 백업파일들은 뒤에 번호가 자동으로 붙어서 관리됩니다.

[소스]
#!/bin/bash
#######################################################################
# lbup - Linux Backup System                                          #
#                                                                     #
# version 0.0.4                                                       #
#                                                                     #
# March 31, 2003                                                      #
#######################################################################

# To set basic environment and default values for variables
defaultpath="/usr/local/backup/lbup"
profile="default.prof"
destroot="/usr/local/backup/lbup/root"
defaultoption="day"

# Function named
checksystem() {

  echo -n "[c] checking user name to run this shell script .................... "
  if [ $USER='root' ]; then
   echo "ok"
  else
   echo "failure"
   exit 0
  fi
 
  echo -n "[c] checking option to select profile ..*........................... "
  case $option in
   -month)
     echo "ok"
     profile="monthly.prof"
     ;;
   -week)
     echo "ok"
     profile="weekly.prof"
     ;;
   -hour)
     echo "ok"
     profile="frequently.prof"
     ;;
   -day)
     echo "ok"
     option="-day"
     profile="daily.prof"
     ;;
   -help)
     echo "ok"
     echo "    - usage: lbup [-month|-week|-day|-hour]"
     echo "        -month: monthly backup"
     echo "        -week : weekly backup"
     echo "        -day  : daily backup(default)"
     echo "        -hour : frequently backup"
     echo "        -help : to see this screen"
     exit 0
     ;;
   *)
     echo "none"
     echo "    - proper usage: lbup [-month|-week|-day|-hour]"
     echo "    - I will use the profile of [-day] as default."
     option="-day"
     profile="daily.prof"
  esac
  backupfile="lbup$option.tar.gz"

  echo -n "[c] checking backup file to resolve old version .................... "
  if [ -f $defaultpath/$backupfile ]; then
   echo "exist"
   count=1
   dupname="lbup$option-$count.tar.gz"
   while [ -f "$defaultpath/$dupname" ]
   do
     count=`expr $count + 1`     
     dupname="lbup$option-$count.tar.gz"
   done
   mv $defaultpath/$backupfile $defaultpath/$dupname
   echo "    - rename last back-up file to $dupname"
  else
   echo "ok"
  fi
 
  echo -n "[c] checking destination directory ................................. "
  if [ -d $defaultpath ]; then
   echo "ok"
  else
   echo "failure"
   echo "    - create a directory for destination: $defaultpath"
   mkdir $defaultpath
  fi

  echo -n "[c] checking profile file .......................................... "
  if [ -f $defaultpath/$profile ]; then
   echo "ok"
   cp $defaultpath/$profile $defaultpath/default.prof
  else
   echo "not found"
   exit 0
  fi

}

# Start of program
echo
echo "= LBUP - Linux Backup System ==========================================="
echo
option=$1
checksystem
echo
echo "[STATUS]"
# Retrive backup list from the profile file
comd="tar cfz $defaultpath/$backupfile"
cat "/dev/null" > $defaultpath/temp.list

for backup in `grep -v ^# $defaultpath/$profile | cat -`
do
  detect=`echo "$backup" | grep '^#'`
  if [ -z $detect ]; then
   echo -ne "  .................................................................."
   if [ -f $backup ]; then
     echo -ne $"\\033[0;36m" "OK" $"\\033[0;0m" "\r"
     echo -n "$backup " >> $defaultpath/temp.list
     #cp $backup $destroot$backup
   elif [ -d $backup ]; then
     echo -ne $"\\033[1;37m" "check" $"\\033[0;0m" "\r"
     echo -n "$backup " >> $defaultpath/temp.list
   else
     echo -ne $"\\033[1;31m" "SKIP" $"\\033[0;0m" "\r"
   fi
   echo "  $backup  "
  fi
done
echo
filelist=`cat $defaultpath/temp.list`
rm $defaultpath/temp.list

execcomd=`echo $comd $filelist`
exec $execcomd
2006/09/08 14:07 2006/09/08 14:07
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 14:07
출처 블로그 > 離別後愛
원본 http://blog.naver.com/marine150/140002249563

1. 저널링 파일시스템이란?

    파일의 입출력 속도를 높이기 위해 미리 정해진 주 메모리에 있는 버퍼를 익히 들어 알고 있을 것이다.

    이러한 종류의 버퍼는 대개 파일시스템에서 디스크 캐쉬로 사용되고 전체적인 성능 향상을 위한 데이타베이스로 이용되고 있다. 하지만 이러한 버퍼가 있는 경우에도 이러한 버퍼가 디스크에 내용을 쓰기 전에 갑작스런 정전등으로 인하여 시스템에 손상이 오는 경우에 문제가 심각해질 수 있다. 결국 이는 재 부팅 후에 시스템이 비정상적으로 작동하게 되는 경우가 생기게 되는 것이다.

    그러면 이러한 경우를 생각해보자. 캐시에는 지워진 파일이 하드디스크에 남이 있는 경우 데이타 베이스와 파일시스템은 정상적인 방식으로 시스템을 복구하게 될 것이다.

    데이타 베이스가 수년간 빠르게 복구되어 오고 있지만 UFS(Unix File System; SCO, System V등의 유닉스의 파일 시스템)와 같은 부류의 경우 파일 시스템의 크기가 커짐에 따라 불의의 사고를 당한 경우에 파일 시스템의 복구 시간이 증가하게 된다.

    이러한 시간이 오래 걸리는 작업은 엄청난 크기의 용량을 가진 서버에 있어서는 성능의 저하를 가져오게 된다. 이러한 이유로 데이타 베이스 복구 기술을 빠르게 할 필요성이 느껴졌고, 이로 인해 저널링 파일시스템이 생겨나게 된 것이다.


2. 저널링 파일 시스템은 어떻게 작동하나?

    그러면 이와 같은 저널링 파일시스템은 어떻게 작동하는지 살펴보자.

    대부분의 중요한 데이타 베이스 엔진들은 트랜잭션이라는 것을 이용한다. 트랜잭션은 몇 가지 특징을 만족시키는 기능들의 집합이라고 할 수 있다.

    트랜잭션의 ACID는 Atomicity, Consistency, Isolation, Durability를 의미하는데 여기서 가장 중요한 특징 중의 하나는 Atomicity이다. 이 특징은 한번의 트랜잭션에 속한 여러 작용들이 에러없이 종료되거나 변화없이 이상한 작업이 취소되는 것을 의미한다.

    이러한 특징은 Isolation과 함께 마치 부분적으로 작동할 수 없는 아주 기본적인 작동인 것처럼 보이게 하고 일관성을 유지 못하는 경우에 일관성을 유지하려는 문제와 관련하여 계속해서 데이타베이스 위에 존재하게 해주는 역할을 하게 된다.

    데이타 베이스는 이러한 기능을 이용하여 트랜잭션이 있는 동안 모든 작용을 로그 파일에 기록하게 된다. 이러한 작용이 기록될 뿐만 아니라 실행되기 전 작용인자의 내용이 모두 기록된다. 모든 트랜잭션이 일어난 후에 버퍼가 디스크에 쓰게 하는 작업을 수행하게 한다. 따라서 시스템이 비정상적으로 셧다운 된다 하더라도 로그를 추적하여 결국은 데이타베이스를 복구하게 된다.

    저널링 파일시스템은 이러한 동일한 기술을 이용하여 파일시스템의 작용들을 로그파일로 남겨두고 빠른 시간안에 복구가 가능하게 만들어준다.

    데이타 베이스와 파일시스템 저널링 사이의 차이라면 데이타 베이스는 사용자와 제어할 데이타의 기록을 남기고 파일 시스템은 단지 메타데이타만을 저장한다. 메타데이타라는 것은 파일시스템 내의 제어구조인데 i-node와 free block allocation maps, i-node map 등을 의미한다.


    (1)  저널링 파일시스템의 장점

    기존의 UFS와 ext2 파일시스템은 크게 두 가지의 문제를 갖고 있다.

    첫번째로는 새로운 저장공간을 다루는데 문제를 갖고 있는데 기존의 파일시스템은 특정 파일과 디렉토리, 사이즈에 맞게 설계되었는데 파일시스템의 구조가 고정된 파일 사이즈의 정보와 고정된 논리 블록 숫자를 저장할 비트수를 가지고 있다. 이러한 이유로 결국 파일 크기와 파티션 사이즈, 디렉토리 크기가 제한을 받게 된다.
    두번째의 큰 문제는 기존의 파일시스템이 새로운 저장공간의 관리가 부적절하다는 것인데 기존의 파일시스템의 구조가 새로운 객체의 크기를 때로는 다룰 수는 있지만 때로는 성능의 이유로 이러한 객체를 다루기에 부적합하게 된다.

      (1)-1  파일크기 처리와 자유 블럭 구조
      이러한 제한 사항들을 저널링 파일시스템은 해결했는데 파일 사이즈의 제한이 상당히 커졌다는 점이다.


      최대파일 시스템 크기

      블록 크기

      최대파일크기

      XFS

      18,000 페타바이트

      512바이트-64KB

      9,000 페타바이스

      JFS

      512 바이트블럭/
      4 페타바이트

      512, 1024,
      2048, 4096

      512Tb/
      512 바이트블럭

      4KB/
      32 페타바이트

      4 페타바이트/
      4KB 블럭

      ReiserFS

      4GB 블럭, 16Tb

      64KB까지이며 현재는 4KB로 고정

      4GB, 2^10
      2^10 페타바이트

      Ext3FS

      4Tb

      1KB-4KB

      2B


      XFS는 SGI의 IRIX에서 사용하는 대용량 파일 시스템이고 JFS는 IBM의대용량 저장매체를 위한 저널링 파일시스템이고 ReiserFS는 수세 리눅스가 개발한 저널링 파일시스템, Ext3는 Ext2 파일시스템의 다음 버젼이다.

      기존의 파일시스템의 구조는 파일시스템의 크기가 커지는 경우 남아도는 블럭을 트래킹하는 비트맵이라는 것을 이용하는데 이 비트맵 또한 크기가 커지게 된다. 여기에 기존의 파일 시스템이 사용하는 알고리즘을 이용하는 경우 남아도는 블럭을 위치시킬 시간이 오래 걸리기 때문에 성능이 저하가 된다. 이러한 문제를 해결하기 위해서 저널링 파일시스템은 B+Tree 방법을 사용하는데 이 방법은 동시에 몇 개의 자유블럭(free block)을 위치시키는데 사용한다. 결국 이렇게 되면 각 블럭에 대한 비트가 굳이 필요없게 되고 이러한 자유블럭이 파일시스템의 크기에 의존하지 않게 된다. 또한 자유블럭을 유지만 하면 성능면에 있어서도 아주 좋게 된다.

      (1)-2  커다란 디렉토리 다루기

      파일시스템은 디렉토리라는 것을 사용하는데 파일시스템의 관점에서 볼 때, 이는 디렉토리 엔트리의 모음이라고 할 수 있다. 이러한 디렉토리 엔트리들은 i-node 숫자와 파일이름의 조합으로 되어 있다.

      기존의 파일시스템은 디렉토리 엔트리를 디렉토리 내에서 하나의 리스트로 정렬을 시켰는데 엄청나게 많은 파일과 다른 디렉토리가 저장된 경우에는 이러한 방법은 그렇게 성능이 좋지 않게 된다. 저널링 파일시스템의 경우 디렉토리 엔트리를 하나의 디렉토리에 넣어버리고 모든 디렉토리 엔트리를 이름으로 구별하게 해버린다. B+Tree 구조(Balanced Tree로서 디스크에 저장된 기록을 빠르게 검색하게 도와주게 메인노드에서 아래 노드의 인덱싱을 이용하여 데이타 베이스에서 빠른 자료 접근이 필요할 때 많이 이용된다. 자세한 내용은 참고문헌을 참조하면 된다)는 어떠한 디렉토리 요청이 있는 경우파일의 i-node를 쉽게 위치시키게 되고 그만큼 빠르게 된다. B+Tree의 인덱싱 기능으로 인해 자료를 검색하고 접근하는데 기존의 비트맵보다는 상당한 시간 감축이 이루어진다.

      (1)-3  커다란 파일 다루기

      또한 커다란 파일을 다루는 경우에 있어서도 기존의 UFS나 ext2는 작은 파일을 주로 다루는 것만 생각하여 설계되었다. i-node는 UFS와 ext2가 파일에 관계된 정보를 관리하기 위해 사용한 구조이다.

      즉 파일에 대한 퍼미션과 파일 형태, 링크의 개수, 파일에 의해 사용되는 파일시스템의 블럭을 관리할 지시자와 같은 정보를 포함하고 있다. i-node는 간접적인 포인터와 2중 3중의 포인터를 포함하고 있는데 간접적인 포인터는 논리블럭을 지시하는 다른 포인터가 어디에 있는지 알려주는 것이고 2중-간접포인터는 이러한 간접포인터를 포함하는 블럭을 가리키는 포인터이고 3중의 경우는 이러한 2중 포인터들을 포함하는 블럭을 가리키는 포인터이다. 이러한 경우에 이러한 간접 포인터들을 이용하면 수많은 디스크 접근이 필요하게 된다. 결국 파일 사이즈가 커지게 되면 이러한 접근시간이 아주 많이 걸리게 된다.

      새로운 저널링 파일 시스템은 디스크 공간을 효율적으로 사용하여 커다란 파일을 지시하는 것을 좀더 효율적으로 다루게 된다. 간접적인 포인터의 사용을 최소화하기 위해서 저널링 파일시스템은 더욱더 큰 논리 블럭을 이용하는데 이는 블럭당 더 많은 정보를 넣을 수 있게 된다. 하지만 더욱더 큰 논리 블럭의 경우는 내부 프레그멘테이션(블럭크기가 특정 파일을 나누지 못하는 경우에 파일시스템은 새로운 블럭을 할당하게 되는데 이 블럭이 다 차지 않게 되는 경우 공간을 낭비하게 된다. 이를 내부 프레그멘테이션이라고 한다)을 증가시킨다.

      결국은 기존의 파일 시스템과 다른 부분은 B+Tree를 이용한 인덱싱이 이러한 효과를 가져온다고 보면 된다. 블럭 포인터를 이용하는 대신 이러한 extents(연속적인 논리블럭의 모음으로 데이타를 확인하는 시간을 대폭 줄여준다. 참고문헌 참조)을 이용하면 커다란 블럭을 이용하는 것과 같은 효과를 가져오게 된다.

      이는 결국 커다란 파일의 주소를 정하고 찾는 문제를 해결 해준다. 결국 새로운 i-nodes는 extents를 지시하는 직접적인 포인터를 유지하고 파일은 이 경우 더 많은 extents가 필요하게 된다. 작은 파일을 효율적으로 다루기 위해서는 그냥 i-node 내에서 파일의 데이터를 저장한다. 결과적으로 파일의 i-node가 들어오자마자, 파일의 데이타가 들어오는 것과 같다. 이는 심볼릭 링크에 매우 유용한 기술이다.

      이러한 잇점들을 가진 저널링 파일시스템은 대용량 서버에 이용되었는데 리눅스에 이용되면서 그 기능들이 더욱더 리눅스에 힘을 실어주게 된다.

2006/09/08 14:07 2006/09/08 14:07
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > sumpf님의 블로그
원본 http://blog.naver.com/sumpf/20015899336
## 특정 ID로만 로그인 허용 설정
vi /etc/pam.d/smtp

auth required /lib/security/pam_listfile.so item=user sense=allow \
                       file=/etc/mail/smtp onerr=succeed

## 릴레이 허용 여부 진단
http://www.antispam-ufrj.pads.ufrj.br/test-relay.html

## smtp 서버에서 보내는 양 제한
O MaxMessageSize=5024000

## 받는 메일 사이즈 제한
/T=DNS/RFC822 검색
M=5024000 으로 변경

## 동시에 발송 가능한 메일 개수 제한
O MaxRecipientsPerMessage=20

## 버전정보 표시하지 않기
/etc/mail/sendmail.cf
DZ0.0.0
O SmtpGreetingMessage=$j linux $Z; $b
보안 설정
O PrivacyOptions=authwarnings, noexpn, novrfy

## 큐잉서버 만들기
server.com. 1D  IN  MX  10  server.com.
server.com. 1D  IN  A       192.168.10.102
server.com. 1D  IN  MX  20  mail2.server.com.
mail2       1D  IN  A       192.168.10.103
server.com. 1D  IN  MX  30  mail3.server.com.
mail3       1D  IN  A       192.168.10.104

mail2 와 mail 3 서버에서의 작업
vi /etc/mail/access
server.com  RELAY     # 공통

vi /etc/mail/local-host-names
mail2.server.com      # mail2 서버에서의 작업
mail3.server.com      # mail3 서버에서의 작업

mail -v server@domple.com   # 메일보내기

## 메일 user 암호화 하기
http://www.stunnel.org/

## SPAMASSAIN 설치
$perl -MCPAN -e shell
cpan> install Mail::SpamAssassin
소스로 설치시
http://search.cpan.org/
http://spamassassin.apache.org/downloads.cgi?update=200506061100
압축해제
perl Makefile.PL
make; make install;
$spamassassin -D --Init     # 에러내용보기

# 메일 전송 과정
발송자 -> MUA(Mail User Agent) -> MTA -> 라우팅 -> MTA -> MDA -> MUA ->수신자
         아웃룩 익스프레스       sendmail                procmail

## ip 추적
whois 218.38.12.9@whois.radb.net        
http://www.radb.net/

http://www.fixedorbit.com/search.htm
whois 218.38.12.9@whois.arin.net
whois 218.38.12.9@whois.apnic.net                        
2006/09/08 14:07 2006/09/08 14:07
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > Sweets For My Spitz
원본 http://blog.naver.com/kul2k/6200172

리눅스는 런레벨이라는 개념을 가지고 있는데, 어떤 런레벨을 사용하느냐에 따라
다른 서비스가 시작된다.


0: 시스템 정지(예약영역)
1: 단일 사용자 모드(예약영역)
2: NFS를 사용하지 않는 다중 사용자 모드
3: 완전한 다중사용자 모드
4: 사용하지 않음
5: 완전한 다중 사용자모드 + X11(xdm) 로그인
6: 시스템 리부팅(예약영역)

S,s: 런레벨을 1로 하는데 사용되는 스크립트-직접 사용하지 않음
7-9: 유효하지만 일반적으로 사용하지 않음

런레벨은  init 에 의해 제어되며, init는 커널 부트 시퀀스의 마지막 단계에서 시작된다.
디폴트 런레벨은 /etc/inittab 파일 안에서 다음과 같이 정의 되어 있다.

id:3:initdefault:

이 시스템의 디폴트런레벨은 3이다.
리눅스가 부트할때, lilo 프롬프트에서 런레벨을 입력함으로써 결정할 수 있다.
커널이름이 linux 라고 가정하면, 다음과 같이 해서 단일 사용자 모드(런레벨 1)fh
직접 부트 할 수 있다.

lilo: linux 1

또는 telinit 명령어를 사용하여 언제든지 런레벨을 변경할 수 있다.
]
root#telinit 1

2006/09/08 14:06 2006/09/08 14:06
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 14:05

1.1. SELinux의 이해

Q: SELinux란?

A: 휘도라 코어(Fedora Core)의 SELinux(Security-Enhanced Linux)란 리눅스 보안 모듈 구조체(Linux Security Modules(LSM) framework)를 이용하여 리눅스 커널에 의무 접근 제어(Mandatory Access Control - MAC)를 구현하는 것이다. 표준 리눅스 보안(Standard Linux Security)은 자유재량 접근 제어(Discretionary Access Control ? DAC) 모델이다. DAC 모델에서, 파일과 자원에 대한 결정권은 오직 해당 객체(objects)의 사용자(user id)에게 있고 소유권(ownership)에 따라 이뤄진다. 각 사용자와 그 사용자에 의해 실행된 프로그램은 자기에게 할당된 객체에 대해 전적으로 자유재량권을 갖는다. 이러한 상황에서는, 악의 있는 일반 혹은 루트 사용자(예로, setuid와 setgid)가 실행시킨 결함이 있는 소프트웨어를 통해 주어진 객체로 원하는 어떠한 일을 해도 막아낼 방법이 없으며 보안 정책을 시스템 전체에 걸쳐 시행되도록 할 방법이 없다.

MAC 시스템은 위와 같은 빠져있는 요소들을 제공한다. 첫 째, 보안 정책을 모든 프로세스나 객체에 대하여 관리차원으로 규정 지을 수 있다. 둘 째, 커널에 SELinux를 구현하면, 모든 프로세스와 객체를 제어할 수 있다. 셋 째, 결정은 단지 인증된 사용자(user identity)에 의해서가 아니라 이용 가능한(available) 모든 보안 관련 정보에 근거하여 이뤄진다.

SELinux하에서 MAC는 모든 주체(subjects ? 사용자, 프로그램, 프로세스)와 객체(파일, 디바이스)에 대해서 국부적으로 허가(granular permissions)해 줄 수 있다. 응용프로그램에서 불필요한 부분은 제외하고 오직 필요한 기능에 대해서만 사용 권한을 안전하게 부여한다.

SELinux 구현은 역할과 유형 시행(Type Enforcement - TE)에 기초하여 추상적 사용자 수준 제어(abstracted user-level control)를 제공하는 역할 기반 접근 제어(role-based access control ? RBAC)를 사용한다. TE는 접근 제어를 처리하기 위해서 테이블(매트릭스)을 이용한다. 주체는 영역(domain)을 갖고 객체는 유형을 갖으므로, 매트릭스에서 교차조회하여 이들의 상호작용을 규정한다. 이는 리눅스 시스템에 있는 모든 동작자(actor)에 대하여 극단적으로 국부 제어를 가능케 한다.


Q: SELinux 정책이란?

A: SELinux 정책은 사용자, 프로그램, 프로세스 그리고 이들의 동작 대상인 파일과 디바이스를 포함한 시스템 전체, 즉, 모든 주체와 객체에 대한 접근 허가(access permissions)를 기술한다. 휘도라 코아 정책은 관련 소스 패키지와 함께 패키지로 공급된다. 현재 공급되는 정책 패키지는 다음과 같다.

? selinux-policy-strict-<version-arch>.rpm and selinux-policy-strict-sources-<version-arch>.rpm

? selinux-policy-targeted-<version-arch>.rpm and selinux-policy-targeted-sources-<version-arch>.rpm

설치시 정책 소스는 /etc/selinux/policyname/src/policy에, 바이너리 정책 파일은 /etc/selinux/policyname/policy에 놓인다. 정책 소스는 최소 설치(ultra-minimal installations)에 포함되지 않는다. 유형과 영역에 대한 정책은 주체와 객체에 대한 보안 문맥과 구분해서 별도로 설정된다.


Q: SELinux 목표 정책(SELinux targeted policy)이란?

A: 처음 SELinux가 휘도라 코아에 포함됐을 때, NSA의 엄격한 정책이 시행됐었다. 시험 목적으로, 이는 그 엄격한 정책을 통해서 수백가지 문제점을 찾아낼 수 있었다. 뿐만 아니라, 휘도라 사용자들의 다양한 환경에 단 하나의 엄격한 정책을 적용한다는 것은 실효성이 없다는 것이 명백히 드러났다. 기본 설치 이외의 것에 대해서 단일 엄격한 정책을 적용하는 것은 현지 일반 사용자에게 전문 지식(기술)을 요구하는 것이었다.

이 시점에서, SELinux 개발자들은 사용자들이 선택한 내용을 검토하고, 다른 전략을 시도하기로 결정했다. 특정 데몬들, 특히, 깨지거나 손상(오염)되면 시스템을 황폐화시키거나 공격받기 쉬운 것들을 옥죄는(lock down) 데 초점을 맞추는 정책을 만들기로 했다. 시스템의 나머지 부분은 SELinux가 활성(enabled)이든 아니든 관계없이 똑같이 가동되도록, 즉, 마치 표준 리눅스 보안하에 운영되고 있는 것처럼 동작하도록 허용한다.

목표 정책 하에서, 대부분의 프로세스는 unconfined_t domain(무제한 영역)에서 가동된다. 그 이름이 의미하는 바와 같이, 이 프로세스들은 거의 SELinux 정책에 의한 제한을 받지 안는다. 그러나, 그 프로세스들은 여전히 표준 리눅스/유닉스 보안에 의해 통제된다.

특정 네트워크 데몬들은 전용 정책을 갖고 있어, 응용프로그램이 시작될 때, 무제한 정책(unconfined_t policy)이 전용 정책으로 전이된다. 예를 들면, 시스템 부팅시, init는 무제한 정책하에서 가동하지만, named가 시작할 때, named 영역으로 전이되고 적시에 적절한 정책에 의해 옥죄어진다.

각 구체적인 데몬에 대한 목표 정책을 활성화 혹은 비활성화 시키는 것에 관하여 더 알고 싶으면, system-config-securitylevel의 사용법을 참조하기 바란다.


Q: 어떤 데몬이 목표 정책에 의해 보호받는가?

A: 현재, 데몬 일람표에는 dhcpd, httpd(apache.te), named, nscd, ntpd, portmap, snmpd, squid 그리고 syslogd가 있다. 이 데몬들에 대한 정책 파일은 /etc/selinux/targeted/src/policy/domains/program에서 찾을 수 있다.

향후, 더 많은 데몬들이 목표 정책 보호(targeted policy protection)에 추가될 것이다.


Q: 어느 데몬을 목표 정책에 추가할 것인가? Sendmail, Postfix, MySQL, 혹은 PostgreSQL?

A: SELinux 개발자는 긍극적으로 ftp와 메일 에이젼트를 목표 정책에 추가하고자 한다. 예를 들면, vsftpd는 로그인과 비슷하게 동작한다. 즉, 로그인후 새로운 프로세스가 사용자 문맥(실사용자 혹은 무명씨 문맥)하에 실행된다.

메일 에이젼트가 안고 있는 문제중 하나는 메일 에이젼트는 사용자 홈 디렉토리에 있는 파일을 조작해야 하는 일이 자주 생기는 것이다. 목표 정책의 목적중 하나는 사용자 홈 디렉토리에서 문제들을 분류하지 않는 것이다. 이 생각은 아직도 변함이 없다.


Q: 염격한 정책은 어떤가? 이 정책 조차도 유효한가?(Does it even work?)

A: 엄격한 정책은 휘도라 코아에서 분명히 적용되고 있다. 이는 다른 사용자의 독특한 환경에 의해 문제를 야기시킬 수 있다. 엄격한 정책이 적절하게 운영되려면, 정책과 시스템 둘 다 미세조정(tweak)해야 할 지도 모른다.

엄격한 정책을 사용하는 데 좀더 용이하도록 하려고, SELinux 개발자들은  정책 변경을 더 쉽게 할 수 있도록 노력해왔다. 예를 들면, system-config-securitylevel은 재명명하기(relabel)를 시동 스크립트안에 갖고 있다(build).


Q: 파일 문맥이란?

A: 파일 문맥은 파일이나 디레토리의 보안 문맥을 기술하는 항구적 라벨(꼬리표)(persistent labels)을 만들기 위해 setfiles 명령에 의해 사용된다.

휘도라 코아는 검사, 복구, 재명명(check, restrore, and relabel) 등, 이상 세가지 옵션을 지원하는 명령 스크립트 fixfiles를 갖고 있다. 이는 사용자가 selinux-policy-targeted-sources 패키지를 설치하지 않고도 파일 시스템을 재명명(relabel)할 수 있도록 해준다. 명령 라인 사용법은 표준 setfiles 명령보다 더 친숙하다.


Q: 파일, 사용자, 프로세스의 보안 문맥을 확인하는 방법은?

A: 새 옵션 ?Z는 주체나 객체의 문맥을 표시하기 위한 손쉬운 방법이다:

ls -alZ file.foo

id -Z

ps -eZ


Q: 영역과 유형은 어떻게 다른가?

A: 비록 영역이 프로세스의 유형으로 자주 언급될 지라도, 영역과 유형 사이에는 차이점이 없다. 이렇게 볼 때, 영역의 사용은 영역과 유형을 구분하는 전통적 TE 모델에 기인한다.


1.2. SELinux 제어하기


Q: SELinux 설치 및 설치 안하는 방법은?

A: 방화벽 설정 화면에서 선택한 사항에 기초하여 설치자(installer)가 처리한다. 기본 가동 정책(default running policy)은 목표 정책이며, 기본으로(by default) 가동된다.


Q: 사용중인 정책을 교체하는 방법은?

A:  정책 교체는 가볍게 취할 사안이 아니다.

연구 목적으로 시험 장비(test machine)에서 새 정책을 시도하는 이외, 생산 시스템(production system)에서는 다른 정책으로 교체하기 전에 현황을 심각하게 고려해야 한다. 교체 작업은 간단하다. 이는 매우 안전한 방법이지만, 우선 시험 시스템에서 일차 시도해 보는 것이 바람직하다.

한 가지 방법은 system-config-securitylevel을 사용하여 정책을 바꾸고 재명명(relabel)하도록 파일 시스템을 설정하는 것이다.

수작업 절차는 다음과 같다:

1. /etc/selinux/config을 편집하고 SELINUXTYPE=policyname으로 정책 유형을 바꾼다.

1. 재부팅하여 돌아올 수 있는 지 확인하기위해, SELINUX=permissive모드로 설정한다. 이렇게 하면, SELinux는 정확한 정책하에서 가동될 것이지만, 만일 부정확한 파일 문맥 명명(labeling)과 같은 문제가 있으면 로그인하도록 할 것이다.

1. sysadm_r 역할을 갖춘 root로 파일 시스템을 재명명한다(relabel):

id -Z

root:sysadm_r:sysadm_t

fixfiles relabel

옵션 -l /path/to/logfile을 사용하여 표준 출력으로 로그를 볼 수 있고, 옵션 -o /path/to/file을 사용하여 검토(checked)되거나 재명명(relabel ed)된 모든 파일 리스트를 저장할 수 있다.

1. 시스템을 재부팅한다. 새 정책하에서의 재시작은 모든 시스템 프로세 스가 적절한 문맥에서 시작되고 정책 변경으로 인한 모든 문제가 드 러나게 한다.

1. sestatus ?v 명령으로 발효된 변경사항을 확인한다. Permissive 모드로 가 동된 새 시스템에서, avc: denied 메시지를 /var/log/messages에서 확인한 다. 이들은 새 정책하에 문제없이 시스템이 가동되도록 해결해 야 할 문제들을 표시해 준다.

1. 새 정책하에서 시스템이 만족스럽게 돌아갈 때, SELINUX=enforcing 으로 바꿔 실행 권한을 부여한다. 실시간에 enforcing을 활성화 시키기 위 해 재부팅하거나 setenforce 1 을 실행한다.


Q: 목표 정책하에서 특정 데몬에 대하여 SELinux protection을 활성화/비활 성화 방법은?

A: 특정 데몬의 부울 값을 제어하려면 system-config-securitylevel을 사용한다. 예를 들어, 만일 apache가 시스템상에서 올바르게 동작하도록 하기위해서는 SELinux를 비활성화시켜야 한다면, system-config-securitylevel으로 해당 값을 비활성화시키면 된다. 이는 apache.te에 정의된 정책으로 전이되는 것을 막고 httpd가 일반 리눅스 보안하에 있도록 한다.


Q: 부팅시 SELinux를 비활성화시키는 방법은?

A: 커널 명령 라인에 selinux=0를 추가한다.  SELinux를 비활성화시킬 때 주의

이 옵션을 사용할 때는 매우 주의해야 한다. 만일 selinux=0로 부팅하면, SELinux가 비활성인 동안 만든 모든 파일은 SELinux 문맥 정보를 갖고 있지 않을 것이다. 적어도 파일 시스템을 재명명(relabel)해야 할지도 모르고, 복구를 위해 단일 사용자 모드로 부팅할 때 필요한 selinux=1로 부팅이 안될 수도 있다. Selinux=0의 대안으로 /etc/selinux/config의 SELINUX=disabled을 사용하다.

Q: 부팅시 enforcing을 활성화/비활성화하는 방법은?

A: /etc/sysconfig/selinux 설정 파일을 이용하여 SELinux 모드를 지정할 수 있다.

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#       enforcing - SELinux security policy is enforced.

#       permissive - SELinux prints warnings instead of enforcing.

#       disabled - No SELinux policy is loaded.

SELINUX=enforcing

# SELINUXTYPE= type of policy in use. Possible values are:

#       targeted - Only targeted network daemons are protected.

#       strict - Full SELinux protection.

SELINUXTYPE=targeted

enforcing에 값을 지정하는 것은 enforcing을 활성화하기 위해 커널을 부 팅할 때 명령 라인에 enforcing=1을 추가하는 것과 같다. 반면에, permis-sive에 값을 지정하는 것은 enforcing을 비활성화하기 위해 enforcing=0 를 추가하는 것과 같다. 명령 라인 커널 인자는 설정파일에 우선한다는 것을 명심하자(Note that the command line kernel parameter overrides the configuration file.).

그러나, disabled에 값을 지정하는 것은 커널 부트 인자 selinux=0을  사용 하는 것과 다르다. 커널에서 SELinux를 완전하게 비활성화시키는 것과 달 리 대신 disabled를 설정하는 것은 enforcing을 비활성화하고 정책 적재를 하지않고 건너뛰는 것이다.


Q: 재부팅하지 않고 enforcing 모드를 임시로 비활성화시키는 방법은?

A: 이 상황은 보통 정책에 의해 금지된 동작를 수행할 수 없을 때 발생한다. 실시간으로 enforcing모드를 비활성화시키기 위해서 sentenforce 0명령을 실행한다. 작업이 끝나서 enforcing 모드로 돌아오기 위해서는 sentenforce 1을 실행하면 된다.  sysadm_r 권한(역할) 필수

sentenforce 명령은 sysadm_r 권한을 갖고 수행해야 한다; 그러기 위해, newrole 명령을 사용하거나, 아니면, su ?를 사용하여 root 로 사용자 전환을 하면, 자동으로 sysadm_r 권한을 얻을 수 있다.

Q: 부팅시 시스템콜 auditing 키거나 끄는 방법은?

A: 시스템콜 auditing을 키기위해서는 audit=1을 커널 명령 라인에 추가한다. 끄기위해서는 audit=0을 추가한다.

시스템콜 auditing은 기본적으로 꺼져있다. 켜지면, SELinux가 denied(거부) 메시지가 발생했을 때, 실행중이던 시스템콜에관한 정보를 제공한다. 이는 정책을 디버깅할 때 유용하다.


Q: 재부팅을 하지않고 시스템콜 auditing을 잠정적으로 끄는 방법은?

A: 현재는 지원되지 않고 있다. 향후, auditing을 조정할 수 있는 유틸리티 (utility)가 제공될 것이다.


Q: SELinux 설치에 관한 상태 정보(status info)를 얻는 방법은?

A: root 사용자 권한으로 /usr/sbin/setstatus ?v 명령을 실행하라. 더 많은 정보가 필요하면, 매뉴얼 페이지 setstatus(8)을 참조하라.


1.3. 문제 해결하기


Q: 응용프로그램이 기대했던 데로 동작하지않고 avc: denied 란 메시지가 나타나면, 어떻게 이 문제를 해결하는 가?

A: 이 메시지는 현재 실행된 SELinux 정책이 그 응용프로그램의 동작을 허락하지 않기 때문이다. 이러한 일에는 여러 가지 사유가 존재한다.

첫째, 응용프로그램이 접근하려는 파일중 하나가 잘못 명명되어있을 수 있다. 만일 AVC 메시지가 특정 파일을 참조한다면, ls -alZ /path/to/file 을 수행하여 현재 참조하는 파일명(current label)을 조사해 보라. 만일 그것이 잘못되어 보이면, restorecon -v /path/to/file 을 시도해보라. 만일 파일과 관련된 매우 많 은 거부(denials) 상황이 존재하면, fixfiles relabel 을 수행하거나, 반복적으로 디렉토리 경로를 재명명하기 위해서 ?R옵션과 함께 restorecon 을 수행하고 싶을 수 있다.

다른 때에는, 거부(denials) 현상은 정책에 의해 거부되도록 프로그램에 설정을 바꿔서 발생될 수 있다. 예를 들면, 만일 Apache를 8800포트로 바꾸면, 보안 정책, apache.te,도 관련하여 바꿔야 할 필요가 생긴다. 정책 작성에 관한 상세한 정보가 필요하면, 외부연결 리스트(External Link List)를 보라.

만일 작동중인Apache와 같이 특정 응용프로그램을 구하는 데 어려움이 있으면, 해당 응용프로그램에 enforcement를 비활성화(disable)시키는 방법에 관하여 How to use system-config-securitylevel를 보라.


Q: 기존 /home 파티션이 있는 시스템에 휘도라 코아를 설치하고 로그인을 할 수 없을 때 해결방법은?

A: /home 파티션이 정확하게 명명(label)되지 않았다. 두 가지 방법으로 이 문제를 쉽게 해결할 수 있다.

만일 /home을 반복적으로 재명명(relabel)하고자 한다면:

/sbin/restorecon -v -R /home

만일 잘못 명명된 기타 파일이 없다고 확인하고자 한다면, 전체 파일 시스템을 재명명할 수 있다.

/sbin/fixfiles relabel

fixfiles를 사용하여 policycoreutils 패키지를 설치할 필요가 있을 것이다.


Q: setfiles나 fixfiles를 사용하여 /home을 재명명한 후, 여전히 SELinux 비활성 시스템(non-SELinux-enabled system)으로 /home을 읽을 수 있을까?

A: 비 SELinux 배포판(non-SELinux distribution)의 파일이나 SELinux가 비활성화(disabled)된 파일을 읽을 수 있다. 그러나, SELinux 비활성화 시스템에 의해 생성된 파일 또는 삭제나 재생성된 어느 파일도 보안 문맥을 갖고 있지 않을 것이다. 이는 ~/.bashrc와 같은 파일에서 문제가 생길 수 있다. 휘도라 코아로 다시 돌아갈 때 /home을 재명명해야 할 지도 모른다.


Q: 휘도라 코아와 비SELinux 시스템간에 NFS를 사용하여 디렉토리를 공유하는 방법은?

A: NFS가 많은 파일 시스템을 명확하게 지원하기 때문에, SELinux와 비 SELinux 시스템간에 디렉토리를 공유하는데 NFS를 사용될 수 있다.

NFS를 통해서 비 SELinux 파일 시스템을 마운트할 때, 기본적으로 SELinux는 공유영역에 있는 모든 파일을 nfs_t의 문맥을 갖고 있는 것으로 간주한다. Context=옵션 을 사용하여 수작업으로 그 값을 설정하여 기본문맥(default context)을 덮어쓸 수 있다. 예를 들면, NFS로 마운트된 디렉토리의 파일들을 SELinux에 대한 system_u:object_r:tmp_t의 문맥을 갖고 있는 것처럼 보이게 할 것이다(appear to have a context of system_u:object_r:tmp_t to SELinux).

mount -t nfs -o context=system_u:object_r:tmp_t server:/shared/foo /mnt/foo

SELinux가 파일 시스템을 NFS를 경유하여 엑스포트(export)할 때, 생성된 파일은 자기가 만들어진 디레토리의 문맥을 갖을 것이다. 다시 말해서, 원격 으로 마운트된 시스템(remote mounting system)의 SELinux의 출현 (presence)은 현지 보안 문맥(local security contexts)에 영향을 끼치지 않는다.


Q: 적절한 문맥을 갖는 사용자 홈 디렉토리와 함께 새 리눅스 사용자 계정 을 만드는 방법은?

A: 표준 useradd 명령을 사용하여 사용자 계정을 새로 만들 수 있지만, 우 선 sysadm_r의 문맥을 갖는 루트 사용자가 되어야 한다. 이 문맥 교환은 su

명령에 통합되어 있어 자동으로 일어난다.

su - root

id -Z

root:sysadm_r:sysadm_t

useradd auser

ls -Z /home

drwx------  auser   auser   root:object_r:user_home_dir_t /home/auser 

새 사용자 디렉토리에 대한 초기 문맥은 루트의 정체성(identity)을 갖는다. 이후 파일시스템의 재명명은 그 정체성을 system_u로 바꾼다. 이들은 역할(권한)과 유형이 동일하기 때문에 기능적으로 서로 같다 (object_r:user_home_dir_t).


Q: 다른 모든 SELinux 문서는 su이 단지 리눅스 정체성만을 바꾸고 보안 역할(security role)은 아니라고 말한다.

A: 휘도라 개발팀은 기존 SELinux 관례(existing SELinux practice)와는 조금 다른 방향을 취했다. 보안 문맥 전이는 이제 pam_selinux에 의하여 su에 통합되었다. 이는 시스템 사용을 크게 단순화시켰다. 실제로, 이는 전통전인 su와 SELinux  newrole을 두 단계대신 한 단계로 조합한 것과 같다.

setuid(2)와 같이 다른 형식의 Linux/UNIX® 정체성 변화는 SELinux 정체성 변화를 일으키지 않는다.


Q: 특정 프로그램에 대한 로그를 채우는 avc 오류에 골치를 앓고 있다. 어떻게 하면 그것에 대한 접근을 감시하지(audit) 않도록 선택할 수 있는가?

A: 예를 들어, 만일 dmesg를 감시하지 않길 원했다면, /etc/selinux/targeted/src/policy/dmesg.te 파일에 다음사항을 넣으면 된다.

dontaudit dmesg_t userdomain:fd { use };

이는 모든 유저영역(user, staff과 sysadm)에 대하여 터미널로 출력된 오류를 제거한다.


Q: 비록 허가 모드에서 운행될 지라도(even running in permissive mode), 많은 수의 avc denied 메시지가 나타난다.

A: 비 enforcing 모드에서는 실제 enforcing 모드에 있을 때보다 더 많은 메시지를 받는다. 이는 이전에 enforcing 모드에 있었던 것처럼 커널이 매 접근 거부를 기록하기 때문에 일어난다. 제한을 받지 않기 때문에, 더 많은 실행을 수행할 수 있고, 이는 더 많은 거부가 기록되는 결과를 초래한다.


Q: 오직 SELinux가 enforcing 모드에 있을 때만 특정 허가 거부를 받지만, /var/log/messages에는 어떠한 감시 메시지를 볼 수가 없다. 이들 침묵의 거부(silent denials)의 원인을 밝혀낼(identify) 수 있는 방법은?

A: 침묵의 거부에 대한 가장 공통적인 이유는 정책에 감시 메시지를 억제하 도록 명시적 dontaudit 규칙을 내포하고 있기 때문이다. dontaudit 규칙은 은근한 거부가 감시 기록을 채울 때 이러한 방법으로 종종 사용된다.

특정 거부를 찾으려면, 모든 dontaudit 규칙의 감시(auditing)를 활성화시킬 필요가 있다.

cd /etc/selinux/targeted/src/policy make enableaudit

make load  활성화된 dontaudit 출력은 장황하다

모든 dontaudit 규칙의 감시(auditing)를 활성화하는 것은 다량의 감시 정보를 생산해낼 가능성이 높고, 그 대부분은 찾고자하는 거부와 무관하다. 은근하게 발생하는 거부에 대한 감시 메시지를 구체적으로 찾고자 할 때만 이 기술을 사용하라. 십중팔구(아마) 가능한한 빨리 dontaudit 규칙을 재활성화시키길 원할 것이다.

dontaudit 규칙을 재활성화하려면, 다음을 수행하라.

cd /etc/selinux/targeted/src/policy

make clean

make load


Q: 정책 패키지를 업그레이드할 때(예를 들어, yum을 사용하여), 기존 정책 에 어떤 일이 발생하는가; 자동으로 업데이트되는가?

A: 패키지가 업데이트될 때 정책은 원래데로 재 적재된다. 이는 수작업 make load를 대체한다.

어떤 상황에서, 파일 시스템을 재명명할 필요가 있을 수 있다. 이는 파일 문 맥이 실효성이 없게 된 곳에서 SELinux 버그 수정 과정의 일 부분으로 혹은 정책 업데이트가 file_contexts 으로 변경될 때 발생될 수 있다.

파일 시스템을 재명명한 후, 재부팅이 꼭 필요한 것은 아니지만 모든 프로세 스와 프로그램이 적절한 영역에서 수행되고 있는 지를 확인하는 데 필요하 다. 이는 업데이트된 정책의 변경사항에 크게 영향을 받는다.

만일 정책 소스 패키지(예, selinux-policy-strict)를 설치했다면, 파일 시스템을 재명명하기 위해 다음 명령을 수행한다.

cd /etc/selinux/targeted/src/policy

make

make relabel

reboot

만일 정책 소스를 사용하지 않는다면, 다른 접근법은 fixfiles명령을 사용하는 것이다.

            

fixfiles relabel

reboot 


Q: 만일 응용프로그램 패키지와 함께 보급되는 정책이 재명명이 필요한 방법으로 변경된다면, RPM은 패키지가 소유한 파일들을 재명명을 처리할 것인가?

A: 그렇다. 해당 패키지가 소유한 파일에 대한 보안 문맥은 그 패키지의 헤더 데이터(header data)에 저장되있다. 그 파일 문맥은 패키지 파일이 디스크에 놓여 있으므로  cpio 복사가 된 후 즉시(directly) 설정된다.


Q: 정책과 정책 소스 패키지사이에 어떤 관계가 있는가?

A: selinux-policy-targeted와 같은 정책 패키지는 즉시 적용되는(working) SELinux 설치에 필요 조건인 반면selinux-policy-targeted-sources와 같은 정책 소스 패키지는 기본 정책을 커스터마이즈(customize)하고자 한다면 필요하 다.

정책 패키지는 SELinux 보안 정책을 정의하는 데 필요한 최소한의 파일을 갖고 있다. 최소한의 설치 청사진을 지원하기 위해 크기를 줄였다.

정책 소스 패키지는 /etc/selinux/policyname/contexts/*과 /etc/selinux/policyname/ policy/policy를 만든 데 필요한 /etc/selinux/policyname/src/policy에 소스 정의를 포함하고 있다. Version은 그 정책의 버전 번호이다.

설치할 패키지 선택은 설치 유형에 달려있다. 만일 휘도라 코아 개발자가 정의한 기본 보안 정책 만을 사용하려면, 정책 패키지를 설치만 하면 된다. 어떤 방법이든 보안 정책을 커스터마이즈하거나 아니면 setools를 실행하려 면, 정책 소스를 설치해야 한다.

정책 패키지를 설치하거나 업데이트하면 파일을 설치한 후 새 정책을 적재한다. 마찬가지로, 정책 소스 패키지를 설치하거나 업데이트하는 것은  policy.version파일 뿐만 아니라 file_contexts파일을 재 구축하고 나서 현재 실효 성 있는 정책으로 그 파일을 적재하는 것이다.


Q: 왜 /etc/selinux/policyname/policy/policy.<version>과 /etc/selinux/policyname/src/ policy/policy.<version> 파일은 다른 (크기, md5sums, 날짜)를 갖는가?

A: 정책 패키지를 설치할 때, 미리 컴파일된 바이너리 정책 파일이 /etc/ selinux에 직접 들어간다. 정책 소스 패키지가 설치되거나 업데이트될 때, 바이너리 정책 파일이 /etc/selinux/policyname/src/policy에 구축되고, 다시 /etc/selinux/policyname/policy/로 이동한다. 다른 구축 환경은 다른 크기, md5sums와 날짜를 갖는 목표 파일을 만들게 된다.


Q: 새로운 정책 패키지가 시스템을 비활성화시킬(disable) 것인가?

A: 정책 패키지나 응용프로그램 패키지와 함께 배포되는 정책의 변경은 오류, 더 많은 거부 혹은 기타 원인 모를 동작을 유발시킬 가능성이 있다. 문제를 해결하기 위해, 한번에 하나씩 정책과 응용프로그램 패키지를 되돌려가면서 어느 패키지가 문제를 일으키는지 찾아낼 수 있다. 이전 패키 지로 되돌리지 않으려면, 구버젼 설정파일에 .rpmsave확장자(꼬리표)를 붙 여 저장될 것이다. 문제 해결의 도움을 받으려면, 메일링 리스트, 버그질라, 그리고 IRC를 활용하도록 한다. 능력이 있으면, 스스로 정책을 작성하거나 고쳐 문제를 해결할 수 있다.


Q: 정책 작성에 도움을 줄 수 있는 방법은?

A: 도움을 기꺼이 받아들일 것이다. SELinux 메일링 리스트, fedora-selinux-list@redhat.com에 가입하는 것으로 시작할 수 있다; http://www.redhat.com/mailman/listinfo/fedora-selinux-list에 등록하고 관련 문서를 읽을 수 있다. 비공식 FAQ는 HOWTO 정보를 작성하는 일반 정책 (http://sourceforge.net/docman/display_doc.php?docid=14882&group_id=21266#BSP.1) 을 갖고 있다. 또 다른 새 자원은 기록하는 SELinux 정책 HOWTO(Writing SE Linux policy HOWTO)이다 (https://sourceforge.net/docman/display_doc.php?docid=21959&group_id=21266).

/etc/selinux/policyname/src/policy/에 있는 정책 파일을 보고 시험해보는 것이 상책이다. 실마리를 찾기 위해 /var/log/messages에 있는 avc denied 메시지를 관찰하라.

정책 작성자에게 유용한 도구는 /usr/bin/audit2allow 인데 이것은 /var/log/messages의  avc 메시지를 SELinux에 의해 사용될 수 있는 규칙으로 번역해준다. 이 규칙들은 십중팔구 정리되어야 할 것이다.

audit2allow명령은 세가지 방법으로 입력을 받을 수 있다. 기본은 표준입력 (stdin)이다. -i 옵션을 사용하면 /var/log/messages 로부터 입력을 읽을 수 있고 ?d옵션을 사용하면 dmesg 출력으로부터 입력을 읽을 수 있다.


Q: 콘솔에 메시지가 넘쳐나고 있다. 어떻게 이것을 막아낼 수 있는가?

A: 유용한 제어를 되찾기 위해서는 dmesg -n 1 를 사용하여 콘솔로 나가는 커널 메시지를 끈다.


Q: 정책 소스를 설치하지 않고 기본 정책을 시험할 수 있는가?

A: 단지 selinux-policy-policyname 과 policycoreutils 패키지를 설치하면 SELinux 기본 정책을 시험할 수 있다. 정책 소스를 설치하지 않았으면, fixfiles 명령은 자동으로 파일 시스템 재명명을 처리해준다.

fixfiles relabel은 make relabel와 동일하다. 재명명 동안, /tmp에 있는 모든 파일 을 삭제하여, 구 파일 문맥 라벨을 갖고 있는 파일들을 정리한다.

기타 명령으로는 잘못 명명된 파일을 검사하는 fixfiles check이 있고 잘못 명명된 파일을 고치지만 /tmp에 있는 파일을 삭제하지 않는 fixfiles restore이 있다. fixfiles는 전 파일시스템을 재명명하는 것이 목적이므로 인자로서 디렉토리의 리스트를 취하지 않는다. 특정 디렉토리 경로를 재명명하려면, restorecon을 사용하라.


Q: KDE 응용프로그램을 SELinux하에서 작동하는 데 문제가 있다.

A: KDE 실행파일은 항상 kdeinit으로 나타난다. 그런데 이것은 SELinux 정책으로 실행될 수 있는 것을 제한한다. 이는 모든 KDE 응용프로그램이 kdeinit의 영역에서 실행되기 때문이다.

/tmp와 /var/tmp를 재명명할 수 없기 때문에 SELinux를 설치할 때 문제가 종종 발생한다. 어느 파일이 어느 문맥을 갖어야 하는지 결정하는 좋은 방법 은 없다.

해결책은 KDE를 완전히 로그아웃하고(log out) 모든 KDE 임시 파일을 삭제하는 것이다.

rm -rf  /var/tmp/kdecache-<username>

rm ?rf  /var/tmp/<other_kde_files>

다음 로그인에서 문제가 고쳐져야 한다.


Q: SELinux=disabled가 작용하지 않는 이유는?

A: /etc/sysconfig/selinux

파일에 있는 화잍 스페이스를 주의하라. 코드는 비록 끝에 붙은 스페이스일 지라도 화잍 스페이스에 매우 민감하다.


1.4. SELinux 배치하기

Q: SELinux를 사용하기 위해 어떤 파일 시스템을 선택해야 하는가?

A: 파일 시스템이 올바른 security.*이름공간(namespace)에 xattr라벨를 지원해야한다. ext2/ext3뿐 아니라 필요한 라벨을 지원하는 XFS가 최근 추가되었다.

Q: SELinux는 시스템 성능에 어떠한 영향을 미치는가?

A: 이것은 측정하기 힘든 변수이고 SELinux가 실행되고 있는 시스템의 규모에 크게 의존한다. 성능이 마지막으로 측정됬을 때, 그 영향은 완벽하게 조정이 안된 코드(for completely untuned code)의 약 7%였다. 그 이후의 변경은 네크워크와 같이 어떤 경우에 더 악화시킬 가능성이 있다. SELinux 성능 튜닝은 개발팀이 최우선 과제이다.


Q: SELinux를 효과를 제고하기위해(to leverage SELinx in) 첫째로 보아야 할 것은 어떤 유형의 배치/응용프로그램/시스템 등 인가(What types of deployments/applications/systems, etc.)?

A: 초기에는, SELinux는 거의 특별한 기능을 수행하지 않지만 극도로 엄격 한 보안을 유지하는 것이 중대한 인터넷에 접한 서버에서 동작할 것이다. 그 러한 시스템은 전형적으로 모든 특별한 소프트웨어와 서비스를 제외시키고 웹 서버나 이메일 서버와 같은 매우 집중화된 서비스나 서비스 집합을 운영 한다.

이러한 에지 서버(edge servers)에는 정책을 매우 엄격하게 적용할 수 있다 (lock down). 이것은 다른 성분(components)과의 더 작은 수의 상호작용으 로 더 쉽게 이뤄진다. 마찬가지로, 특별한 제삼 응용프로그램을 운영하는 전 용 박스가 좋은 후보이다.

향후, SELinux는 모든 환경을 목표를 둘 것이다. 그곳에 도달하기 위해서, 공동체와 ISVs(independent software vendors)은 필요한 정책을 생산하기 위해 SELinux와 협력할 필요가 있다. 지금까지, 특정 공격받기 쉬운 데몬에 초점을 맞춘 목표 정책뿐 아니라, 매우 제한적인 엄격한 정책이 쓰여졌다.


Q: 어떻게 SELinux가 제삼 응용프로그램에 영향을 끼치는가?

A: 휘도라 코아에서 목표 SELinux 정책을 구현하는 한가지 목적은 제삼 응용프로그램이 수정없이 동작할 수 있도록 하는 것이다. 이것은 목표 정 책이 그 응용프로그램에 대해 투명하므로(transparent) 제어를 하려하지 않 고 실질적으로 표준 리눅스 보안에 의지한다(This works because the targeted policy is transparent to those applications it is not trying to control that it essentially falls back on standard Linux security.). 이 응용프로그램들은 특별한 보안 방법(extra-secure manner)으로 실행되진 않을 것이다. 정책은 이 응용프로그램이 MAC에 의해 보호되도록 작성될 필요가 있다.

아주 많은 변형의 제삼 응용프로그램이 존재하고 이들이 SELinux, 심지어 목표 정책을 기동할 지라도 서로 어떻게 작용하는가(behave with)를 예측 하는 것은 불가능하다. 발생된 문제(issues that arise)은 때때로 정책에서 해결될 수 있다. 응용 프로그램을 SELinux하에서 동작하도록 수정될 필요 가 있는, 미처 알지 못했던 응용 프로그램과 관련된 보안 문제를 SELinux 가 보여줄 수 있다.

휘도라 코아 시험자와 사용자가 공동체에 가져오는 한가지 중요한 가치는 제삼 응용프로그램의 광대한 시험이다. 그러한 마음가짐으로, 토론을 하기 위해 적절한 메일링 리스트(fedora-selinux-list@redhat.com)에 여러분의 경험을 보내주실 것을 바란다.

2006/09/08 14:05 2006/09/08 14:05
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > Human Packet
원본 http://blog.naver.com/jabusunin/20017852970

Tuning Your SELinux Policy with Audit2allow(Audit2allow 로 SELinux 정책 튜닝하기)
2005년 8월호의 내용입니다.

출처 : http://www.chtla.com/stories.php?story=05/07/26/5732021

Fedora 코어3엔 6개월동안 기본적으로 Security Enhanced Linux (SELinux) 를 탑재하고 있다.
SELinux는 사용자와 그룹, root가 가지는 일반적인 접근보다 휠씬 낫은 분리된 특권을 가지고 있다.
기본적인 SELinux의 설정은 몇몇 사용자에게는 쉬게 보이겠지만, 다른 사용자들은 sendmail.cf 파일이 더 쉽게 보여질것이다.(sendmail.cf 파일을 설정하는 것이 더 쉬워 보일것이다.)
여기서는 audit2allow 툴을 이용해 필요한 정책을 단계적으로 설정하는 것을 보여줄것이다.

SELinux란?

SELinux는 프로세스의 접근제어명령(Mandatory Access Controls) 억제하고, 기록하고, 탐지에 필요한 고리(hook)를 제공하는 커널 패치(2.6.0-test 시리즈에서 kernel.org의 메인커널로 흡수된)이다.
허가와 거부하는 것을 컨트롤 하는 룰은 정책으로 구성된다. 이 정책은 SELinux 프레임워크 아래 관리되는 일들을 명시한 룰들을 포함하고 있다.

전통적인(지금까지 사용되어진) 퍼미션 모델은 사용자, 그룹, unix 파일 허가로 구성되고, 이 모델은 사용자와 그룹이 파일을 읽고, 쓰고, 실행하는 것을 제어할수 있다.
하지만 SELinux는 사용자와 역활,타입으로 더 많은(다양한) 퍼미션을 제공하고 있다.

예를 들어, 전통적인 퍼미션 모델에서 특정포트(1024 포트 밑으로)를 listen 하기 위해서는 해당 프로세스에게 root 권한을 주어야 한다.
이 프로세스가 권한을 가지게 되면, root로써 모든 권한을 행할수 있게 된다.
하지만 SELinux 모델에서는 특정 포트를 특정 서버에게만 권한을 주어 접근하게 할수 있으며, 그외는 허용하지 않는다.

그럼 어떤 리눅스가 SELinux를 지원하는가?
아래 나열된 배포판을 SELinux를 지원하고 있다.

- Fedora Core 2
- Fedora Core 3
- Red Hat Enterprise Linux 4
- CentOS 4
- Debian unstable (kernel support)
- Hardened Gentoo project
- SUSE 9.x (kernel support)
- Ubuntu

그외 추가로 다른 배포판에서도 SELinux 를 지원할 수도 있다. 그외 배포판은 시스템 문서를 참조해 보자.

왜 SELinux 인가?

SELinux 사용하면 리눅스 서버의 보안을 높일수 있다.
프로세스의 제한적인(?) 콘드롤을 지정할수 있기에 취약점이 있는 소프트웨어를 많은 공격(exploit)으로 부터 막을수 있다.

예를 들어, 일반적인 데몬이 실행되고 있다면 하면.. 특정 tcp 포트를 listen하게 되고, 파일의 입력을 저장하기 위해 프로세스에게 요청하면 config 파일을 읽고 난뒤 입력되는 것의 구문을 조사하고, 소켓에게 그 결과를 반환할것이다.

전형적인 권한(퍼미션) 모델에서는 데몬은 tcp를 열기 위해 root 권한을 가지게 되고, listen 상태로 대기하게 된다. (물론 소켓생성후 root 권한을 없어지는 경우도 있지만)
일반적으로 데몬은 실행한 유저의 권한을 가지고 실행을 하게 된다.
그래서 그 사용자가 소유한 디렉토리가 있다면 어떤 파일이든 읽거나 쓸수 있게 된다. 그 유저의 권한으로 실행되는 parsing process(?) 까지도.

데몬 실행시 root 권한으로 실행을 되게 되면 root가 할수 있는 어떤 것이라도 프로세스는 할수 있다는 것이다.
이때 읽거나 쓰는데 문제가 발생한다면 사용자가 읽을수 있는 파일을 인터넷에 노출시키거나, 다른 프로세스의 파일을 덮었는 일도 있을수 있을것이다.
또는 parsing process(?)에 문제가 발생한다면, 프로세스는 특정 프로세스의 사용자 권한(원격접근이 가능한 권한을 가진)으로 실행이 되거나, 서버에 위헙이 될수 있는 명령어도 실행할수 있게 된다.

이제는 똑같은 상황을 SELinux 하에서 생각해 보자.
우선 데몬에 다른 사용자가는 허가하지 않고, 특정 tcp 포트를 열도록 정책을 설정할 것이다.
프로세스(데몬)는 절대로 root로 실행하지 않고, 허가된 타입의 특정 파일만을 읽고 쓸수 있게 될것이다.
또한 parsing process 는 특정 타입의 파일을 읽고, 쓸수만 있으며, 어떤 shell 명령어도 실행할수 없게 된다.
서버와 parser(?)는 /tmp 디렉토리(이와 비슷한 디렉토리도)밑의 파일은 읽고, 쓸수가 없게 된다. 

이처럼 SELinux를 사용하게 되면 프로그램 에러나 설정문제등으로 인해 위험이 노출되는 것을 줄일수 있다.
SELinux를 사용하더라도 시스템 업데이트나 보안에 대한 좋은 습관등은 갖추고 있어야 한다.
SELinux는 단지 시스템 안정하도록 도와주는 많은 것들중 하나일 뿐음을 잊지 말자.

안전한가?

SELinux는 메인 리눅스 커널로 흡수(포함)되었고, 많은 이들로 부터 검증을 받았다.
소스코드는 GPL로 발표(릴리즈)되었으며, 모든 코드는 검증이 가능하다.
몇몇 사용자들은 NSA가 시스템의 백도어로 SELinux를 사용할수 있다는 의문을 제기하기도 했지만, 백도어는 발견되지 않았다.

파일, 프로세스, 사용자

SELinux는 파일과 프로세스에 "보안 상태(security context)"를 구성하게 된다.
이것은 파일 시스템에서 확장 파일시스템 속성에 의해 쓴여진 파일을 말하는 것이며, 시스템의 파일시스템은 확장속성을 꼭 지원해야 한다.
페도라나 레드햇 배포판에서 ls 명령어는 새로운 옵션인 -- -Z 로 파일의 보안상태를 보여줄것이다.
예를 보자.

# ls -lZ /etc/selinux
-rw-r--r--    root    root   system_u:object_r:selinux_config_t config
drwxr-xr-x  root    root   system_u:object_r:selinux_config_t targeted

이것은 /etc/selinux 밑의 파일과 디렉토리를 출력한 것이다.
보안상태(security context)는 system_u가 사용자(user)이고, object_r은 역활(role)이고, selinux_config_t는 타입(type)을 표시한 것이다.
이처럼 사용자/역활/타입을 체크해 현재 SELinux의 정책과 비교하여 시스템에서 허가할지 거부할지를 결정하게 되는것이다.

역시 ps 명령어 사용시에는 -Z 옵션을 사용하면 해당 프로세스의 보안상태(security context)를 볼수 있다.
예를 들어 squid 웹 프록시 데몬이 특정 포트를 오픈해 놓은 상태라면(다른 사용자는 접근할수 없는 상태) 아래와 같은 결과를 볼수 있다.

# ps axZ | grep squid
user_u:system_r:squid_t          3912 ?        Ss     0:00 squid -D
user_u:system_r:squid_t          3915 ?        S      9:10 (squid) -D
user_u:system_r:squid_t          3916 ?        Ss     0:01 (unlinkd)

위에서도 squid 프로세스의 보안상태(security context)를 볼수 있다.
사용자는 user_u이고, 역활은 system_r이고, 타입은 squid_t이다.

유저는 해당 유저가 무엇을 할수 있는지 역활(role)이 지정되어 있다.
역활(role)에는 해당 유저가 웹서버를 실행하거나 ping 명령어 같은 것을 실행할수 있도록 지정할수 있다.
root로 로그인한 상태에서 id 명령어를 실행하면 아래와 같이 출력하게 된다.

# id
uid=0(root)
gid=0(root)groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
context=root:system_r:unconfined_t

역시 root도 system_r 역활과 unconfined_t 타입이라는 것을 알수 있다.

설정하기

레드햇과 페도라에서 SELinux 설정은(사용할것인지, 어떤 방식으로 실행을 할것인지를) /etc/sysconfig/selinux 파일로 한다.
다른 배포판은 경로가 틀릴것이다.
아래는 페도라3의 /etc/sysconfig/selinux 파일의 내용이다.

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=targeted

SELINUX 지시자 설정은 비교적 간단하다.
SELinux의 정책을 실행할것인지, 정책을 실행하는 동안 간단히 기록을 할것인지, 아니면 사용하지 않을것인지를 결정한다.
enforcing 을 입력하게 된다면, 정책이 실행될것이다.
다른 단어를 사용할 경우, 정책에서 액션을 지정하지 않았다면 프로세스는 거부를 하게 될것이다.

SELINUXTYPE 은 어떤 정책을 활성화 할것인지를 결정한다.
페도라 코어 3 에서는 두가지 정책을 선택할수 있다.(targeted와 strict)

targeted정책은 몇몇 프로세스에 관한 정책으로, 정책의 범위에서 벗어나 리스트되지 않는 것을 허가하고,
strict 정책은 대부분의 프로세스를 위한 정책으로, 명확히 허가된 것이 아닌라면 거부하게 된다.

서비스를 거의 하지 않거나, 기본설정에서 변경이 거의 없는 상태로 서비스 하는 서버라면, strict 정책을 사용하고,
그렇지 않다면 targeted 정책을 사용하는 것이 SELinux의 사용이점을 제대로 사용할수 있다.
예를 들어 targeted 정책을 사용한다면, 정책에서 지정된 프로세스들은 SELinux에 의해 감시를 받고, 그외 프로세스는 허가된다.

setenforce 명령어로 enforcing 에서 permissive 방식으로 변경할수도 있다.
setenforce 0 은 permissive 방식이고, setenforce 1은 enforcing 방식이다.
부팅시 SELinux를 비활성화 하면서 커널 명령라인에 selinux=0 를 입력하면 된다.

정책을 변경하기 위해서는 정책 소스 패키지가 꼭 있어야 한다.
페도라 코어3일 경우엔 selinux-policy-targeted-sources 와 selinux-policy-strict-sources 가 소스패키지이다.
이 패키지를 인스톨하려면 아래와 같이 명령어를 주면 된다.

# yum install selinux-policy-targeted-sources selinux-policy-strict-sources

로그기록

SELinux 로그는 프로세스가 거부 되었을때 기록을 한다.(허거되었을때도 기록이 가능하지만)
기본정책이 거부를 허가로 변경해서도 로그를 기록할수도 있다.
아래는 SELinux의 로그 기록이다.(기본적으로 /var/log/messages에 기록된다.)

kernel: audit(1114070701.193:0): avc:  denied  { read } for  pid=24216 exe=/usr/libexec/mysqld name=mysql dev=cciss/c0d0p6 ino=16408 scontext=user_u:system_r:mysqld_t tcontext=root:object_r:var_lib_t tclass=dir

로그를 분석해 보면..

우선 읽기 요구를 거부하고 있다. (denied {read})
읽기 요구를 하는 프로셋의 ID는 24216이다. (for pid=24216)
프로세스 이름은 /usr/libexec/mysqld 이고, (exe=/usr/libexec/mysql name=mysql)
액션의 타켓은 /dev/cciss/c0d0p6 장치에서 실행되고 있다.)
액션 타켓의 inode는 16408이고, (ino=16408)
프로세스의 SELinux context는 user이고, mysqld 타입이다.(scontext=user_u:system_r:mysqld_t)
읽으려고 하는 파일은 var_lib_t 타입의 루트 소유의 파일이다. (tcontext=root:object_r:var_lib_t)

SELinux의 로그 엔트리의 필드를 살펴보자.

audit(timestamp) : 이 필드는 SELinux의 검사 메세지이며, 타임 스탬프 형식으로 기록한다.
avc : SELinux 벡터 캐시 액세스를 나타나며, 거의 모든 기록은 이 캐시이다.
denied | accepted : 이 필드는 해당 액션이 허가되었는지 거부되었는지를 나타낸다. 종종 허가된 메세지를 볼수도 있다.(정책을 리로드할 경우에)
{ read | write | unlink | ... } : 이 필드는 파일을 읽거나, 쓰거나, unlink하거나, 정책을 로딩하거나 등의 액션의 종류을 출력한다.
for pid=<pid> : 접근하는 액션의 프로세스 ID를 나타낸다.
exe=<executable> : 실행되는 프로세스의 경로를 나타낸다.
name=<name> : 액션을 시도하는 타켓의 이름을 나타낸다.
dev=<device> : 타켓 파일이 위치한 디바이스를 나타낸다.
ino=<inode-number> : 액션 타켓의 inode를 나타낸다.
scontext=<security context> : 프로세스의 보안상태(문맥)을 나타낸다. 사용자, 규칙, 타입을 가지고 있다.
tcontext=<target context> : 액션 타켓(파일이나 디렉토리등에 사용되는)의 보안상태(문맥)을 나타낸다.
tclass=<target class> : 타켓 오브젝트(디렉토리, 파일, 디바이스, 노드같은)의 클래스를 나타낸다.

다른 로그를 살펴보자.

kernel: audit(1114800386.039:0): avc:  granted  { load_policy } for
pid=12589 exe=/usr/sbin/load_policy
scontext=root:system_r:unconfined_t
tcontext=system_u:object_r:security_t tclass=security

위 로그는 root에 의해 정책이 리로드 되었음을 알수 있다.(아마 make load 명령어를 사용한듯)
avc가 granted 임을 기억해 두자.

다른 예를 한번 더 보자.

kernel: audit(1114800360.543:0): avc:  denied  { unlink } for
pid=12253 exe=/usr/sbin/named name=example.com dev=hda3 ino=505301
scontext=root:system_r:named_t tcontext=root:object_r:named_zone_t
tclass=file

여기서는 example.com 파일을 named가 unlink 되는 것을 거부했다는 것을 알수 있다.
그것은 /dev/hda3 에 위치하고, inode는 505301 이다.


Audit2allow

mysqld 데몬이 읽으려고 하는 파일이 있을 경우 그 파일을 읽을수 있도록 해 주려면 정책을 어찌 추가해 주어야 할까?
위와 같이 audit 메세지를 허락된 정책라인으로 변경해 주는 audit2allow 라는 훌륭한 툴이 있다.

audit2allow는 페도라나 레드햇 기반의 배포판에 policycoreutils 라는 패키지로 포함되어 있다.
이 패키지는 아래 명령어를 실행하기 전에 인스톨 되어 있어야 한다.
설치되어 있지 않다면

# yum install policycoreutils

로 설치할수 있다.
그래서, audit2allow로 아래 라인을 흉내내어 보자.
(직접 실행을 못해 정확히 무슨 말인지 ㅡ.ㅡ; 테스트후 다시 수정도록 하겠습니다.)

allow mysqld_t var_lib_t:dir read;

이 정책은 mysqld_t 타입의 프로세스는 var_lib_t 타입의 디렉토리를 읽기를 허가한다는 말한다.
이제 정책을 세웠으니, 이것을 리눅스 커널에 로드 시켜보자. 그래야 이 액션이 허가되었음을 알수 있게 된다.
(리눅스 커널에 로드 시켜야 허락된 정책이 적용된다는 뜻이다.)

SELinux 정책소스는  /etc/selinux/<policytype>/src/policy 에 위치한다.
예를 들어 targeted 정책을 사용한다면, 정책 소스의 위치는 /etc/selinux/targeted/src/policy/ 이다.

해당 디렉토리를 보면 Makefile 과 함께 다양한 정책들을 볼수 있을 것이다.
로컬 정책 추가를 위해 /etc/selinux/targeted/src/policy/domains/misc/local.te 파일을 열어 위에서 audit2allow가 준 라인을 추가하자.
이제 커널의 정책을 로드하고, 체크하고, 컴파일 하기 위해 make load 를 실행하자.
그럼 아래와 비슷한 로그를 볼수 있을것이다.

Apr 21 14:34:29 linuxmachine kernel: audit(1114115669.205:0): avc:
granted  { load_policy } for  pid=7648 exe=/usr/sbin/load_policy
scontext=root:system_r:unconfined_t
tcontext=system_u:object_r:security_t tclass=security
Apr 21 14:34:29 linuxmachine kernel: security:  3 users, 4 roles,320 types, 23 bools
Apr 21 14:34:29 linuxmachine kernel: security:  53 classes, 10952 rules

Audit2allow 다른 옵션들

Audit2allow는 다른 여러가지 좋은 옵션을 가지고 있다.

audit2allow -l -i /var/log/messages 이처럼 audit2allow를 실행한다면, 실행시간 이후의 메세지와 정책을 리로드한 마지막 시간을 보게 될것이다.
audit2allow -d 를 사용하면, 커널의 dmesg 버퍼를 읽어서 메세지로 보여줄것이다.

복잡한 응용이나 구성을 가지고 있다면, permissive 모드로 실행해 audit2allow 로 모든 avc 메세지를 기록하거나, enforcing 모드로 실행해서 audit2allow -l 로 각각 실행한 후 출력을 체크하자.

정책 갱신하기

정책을 갱신할때 변경되는 것이 조절을 필요한지 아닌지 살펴봐 업데이트에 반하는 것이 있는지 체크해야 한다.
때로는 메인 정책에 포함된 관습룰(custom role)를 제거하는 결과를 초래할수도 있다.
local.te 파일만 변경했다면, make load 전에 policy.conf 파일을 grep 해서 새 정책이 있는지 체크할수 있다.

주의사항

필요한 룰을 추가할때는 조심하자.
마구잡이로 거부되는 것을 허가하기 위해 룰을 추가하게 되면 침략자가 이용할수 있는 어떤 것을 허가하게 될수도 있다.
정책은 전형적인 사용을 위해 바꿀때, 최소한의 맞춤(변경)이 필요할 것이다.

요약

Audit2allow 는 꼭 필요한 SELinux 정책을 변경할때 유용한 툴이다.
새 정책을 쓰지 않고, 거부된 정책 로그 메세지로 새 정책을 생성해 그것을 사용할수 있다.

참조

Home of the SELinux project -- http://www.nsa.gov/selinux/
The Un-Official SELinux FAQ -- http://www.crypt.gen.nz/selinux/faq.html
SELinux link zoo -- http://www.crypt.gen.nz/selinux/links.html
Ubuntu Linux SELinux pages -- https://www.ubuntulinux.org/wiki/SELinux

원문 : http://www.samag.com/documents/s=9820/sam0508a/0508a.htm

2006/09/08 14:05 2006/09/08 14:05
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > 『해킹.... 속임수의 예술....』
원본 http://blog.naver.com/zsup1343/60003542397
원문 작성자 : 백선우
-서문-

밑에 팁란에 이미 ProFTPD 와 MySQL을 연동하는 방법이 올라와
있어서 ProFTPD의 Stable 버전인 1.2.4 를 사용해서 그 방법으로
해보았는데 셋팅에 별다른 문제가 없음에도 제대로 동작하지 않았습니다.
디버그 모드로 실행해본결과 Signal 11이 발생하면서 종료가 되더군요.
그래서 이곳 질답란에 문의를 해보았지만 아무도 답변을 안해주시더군요.
어쨌든 그냥 포기할까 하다가 1.2.5rc1 을 설치하고 다시 시도한 결과
성공했습니다. 그런데 1.2.5에서는 1.2.4 까지의 SQL 관련 설정 방법에
차이가 있어서 이곳 팁란에 이렇게 글을 올리게 되었습니다.

-ProFTPD 설치 방법-

일단, MySQL은 설치되었다고 가정하고...저의 경우에는 RedHat 7.2에
기본적으로 들어있는 RPM 으로 설치를 했습니다.

그다음은 ProFTPD 설치를 합니다.
www.proftpd.org 에 가셔서 1.2.5rc1 버전을 다운받습니다.
압축 푸시고
./configure --prefix=/usr --with-modules=mod_sql:mod_sql_mysql \
--with-includes=/usr/include/mysql --with-libraries=/usr/lib/mysql \
--sysconfdir=/etc --localstatedir=/var
make
make install

-설정 방법-

그리고 mysql에 database를 만듭니다.
database 이름은 proftp로 짓습니다.
그리고 아래의 테이블을 만듭니다. 아래 테이블은 아래에 있던
ProFTP + MySQL 팁에서 가져왔습니다. 단 한가지 다른 점이 있다면
group 테이블에서 Field 에 gname 을 groupname으로 변경했습니다.
1.2.5rc1에서 Default로 groupname을 찾습니다.

* 테이블명: users
   +---------+------------------+------+-----+---------+-------+
   | Field   | Type             | Null | Key | Default | Extra |
   +---------+------------------+------+-----+---------+-------+
   | userid  | char(12)         |      | PRI |         |       |
   | uid     | int(10) unsigned | YES  |     | NULL    |       |
   | gid     | int(10) unsigned | YES  |     | NULL    |       |
   | passwd  | char(63)         | YES  |     | NULL    |       |
   | shell   | char(255)        | YES  |     | NULL    |       |
   | homedir | char(255)        | YES  |     | NULL    |       |
   | count   | int(10) unsigned |      |     | 0       |       |
   | valid   | int(10) unsigned | YES  |     | NULL    |       |
   +---------+------------------+------+-----+---------+-------+

* 테이블명: groups
   +-----------+------------------+------+-----+---------+-------+
   | Field     | Type             | Null | Key | Default | Extra |
   +-----------+------------------+------+-----+---------+-------+
   | groupname | char(12)         |      | PRI |         |       |
   | gid       | int(10) unsigned |      |     | 0       |       |
   | members   | text             | YES  |     | NULL    |       |
   +-----------+------------------+------+-----+---------+-------+

그리고 /etc/proftpd.conf 를 아래와 같이 편집합니다.
물론 서버명이나 포트, 디렉토리 같은 부분은 여러분에게
맞게 변경해주시기 바랍니다.

ServerName                      "r2al3ac's FTP server"
ServerType                      standalone
ServerIdent                     on "r2al3ac's FTP server ready..."
ServerAdmin                     "r2al3ac@hananet.net"
DefaultServer                   on

Port                            21

Umask                           022

MaxInstances                    30

User                            nobody
Group                           nobody

#아래 SQLConnectInfo 문에서 proftp는 데이터베이스명이며 아이디와 비밀번
호는
#여러분의 mysql 설정에 맞게 변경해주시면 됩니다.
#보시면 1.2.4 버전때와는 다른점이 있음을 알 수 있습니다.
SQLConnectInfo                  proftp@localhost:3306 아이디 비밀번호
SQLAuthTypes                    Backend
SQLAuthenticate                 on
SQLUserInfo                     users userid passwd uid gid homedir  
shell
SQLLog                          PASS updatecount
SQLNamedQuery                   updatecount UPDATE "count=count+1  
WHERE userid='%u'" users
SQLUserWhereClause              "valid = 1"
SQLDefaultHomeDir               /var/ftp
DisplayLogin                    welcome.msg
DisplayFirstChdir               .message

DefaultRoot                     /var/ftp
MaxClients                      4
MaxClientsPerHost               1
MaxHostsPerUser                 1

RequireValidShell               off

AllowRetrieveRestart            on
AllowStoreRestart               on
AllowOverwrite                  on



AllowAll





DenyAll





AllowAll


DenyAll





DenyAll


AllowAll



-테스트 하기-

1. mysql에서 proftp 데이터베이스에 users 테이블에 사용자를 하나 등록 시
킵니다. 단, 반드시 valid 값을 1로 주셔야 됩니다. 만약 1이 아닐경우에는  
로그인이 되지 않습니다.

2. /usr/sbin/prftpd start 를 쳐서 proftpd 를 실행합니다.

3. ftp 나 ncftp 를 사용해서 1번에서 등록해준 사용자와 비밀번호로 로그인
을 해봅니다.

-만약 안된다면-

proftpd.conf 셋팅에 문제는 없는지 확인해보시고,
포트를 다른 걸로 바꿔보시고,
그래도 안된다면 아래와 같은 방법으로 proftpd를 디버그 모드로 실행해서
어디서 어떻게 잘못되었는지 알아보시기 바랍니다.

/usr/sbin/proftpd -d 5 -n -c /etc/proftpd.conf

이렇게 입력하시면 디버그 모드로 실행이 됩니다.

그리고 터미널 창을 하나 더 열어서 ftp 로 접속을 시도해 보시면
어디서 어떻게 잘못되었는지 알 수 있습니다.

-덧붙이는 말-

위에서 SQLAuthenticate 부분을 on 이라고 해놓았는데, 만약
group 테이블을 사용하지 않으시면 SQLAuthenticate users 로
바꿔서 사용하시면 됩니다.

하지만 on으로 해놓아도 별문제 없이 쓰실수 있습니다.

설정문과 관련해서 자세한 것은 proftpd 문서를 참고하시기
바랍니다. 참고로 proftpd.oops.org 나 www.proftpd.org 문서들은
outdate 되어서 1.2.5rc1 과는 차이가 있으므로 proftpd1.2.5rc1을
다운받으면 안에 첨부된 문서를 참조하셔야됩니다.

그럼 꼭 성공하시길 바랍니다.
2006/09/08 14:04 2006/09/08 14:04
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > semigifn님의 블로그
원본 http://blog.naver.com/semigifn/16469526



출처 : 오라닉스 ( http://cafe.daum.net/oranix )

1. bash에서의 쉘변수와 환경변수(1) 쉘변수
 1) 개요: 말 그대로 특정한 쉘 즉 bash에서만 적용되는 변수를 말한다.
 2) 특징
  ㄱ. 지정하는 방법은 '변수명=값' 형태로 지정하면 된다.
    예) [posein@www posein]$ COLOR=red
  ㄴ. 변수값을 출력할 때는 변수명 앞에 $을 붙여 echo명령을 사용하면 된다.
    예) [posein@www posein]$ echo $COLOR
      red
(2) 환경변수: 모든 쉘에 영향을 미치는 변수라는 것을 제외하고는 쉘변수와 지정방법이나 특징이
        유사하다.
(3) bash에서 쉘변수를 환경변수화시키기: export명령을 사용하면 된다.

2. 일반적인 환경변수목록(1) 환경변수
 1) HOME : 사용자의 홈디렉토리
 2) PATH : 실행파일을 찾는 경로
 3) LANG : 프로그램 사용시 기본 지원되는 언어
 4) PWD : 사용자의 현재 작업하는 디렉토리
 5) TERM : 로긴 터미널 타입
 6) SHELL : 로그인해서 사용하는 쉘
 7) USER : 사용자의 이름
 8) DISPLAY : X 디스플레이 이름
 9) VISUAL : visual 편집기의 이름
 10) EDITOR : 기본 편집기의 이름
 11) COLUMNS : 현재 터미널이나 윈도우 터미널의 컬럼수
 12) PS1 : 명령프롬프트변수
 13) PS2 : 2차 명령프롬프트이다. 명령행에서 를 사용하여 명령행을 연장했을 때 나타난다.
 14) BASH : 사용하는 bash 쉘의 경로
 15) BASH_VERSION : bash의 버전
 16) HISTFILE : history 파일의 경로
 17) HISTFILESIZE : history 파일의 크기
 18) HISTSIZE : history에 저장되는 갯수
 19) HISTCONTROL : 중복되어지는 명령에 대한 기록 유무를 지정하는 변수이다.
 20) HOSTNAME : 호스트의 이름
 21) LINES : 터미널의 라인 수
 22) LOGNAME :로그인이름
 23) LS_COLORS : ls 명령의 색상관련 옵션
 24) MAIL : 메일을 보관하는 경로
 25) MAILCHECK : 메일확인시간
 26) OSTYPE : 운영체제 타입
 27) SHLVL :쉘의 레벨
 28) TERM :터미널종류
 29) UID : 사용자의 UID
 30) USERNAME : 사용자이름
(2) 사용예
 1) [posein@www /]$ mkdir $HOME/backup
   [posein@www /]$ ls -ld $HOME/backup
   drwxrwxr-x   2 posein  posein     4096 1월 15 01:31 /home/posein/backup
 2) [posein@www /]$ echo $PS1
   [u@h W]$
    => 프롬프트 형식
      d : '요일 달 날짜'형태로 나타내준다. (예 "Wed Jan 15")
      h : 호스트이름을 보여준다. 보통 '.'를 사용한 이름인 경우 첫번째 '.'까지 보여준다.
      H : 호스트이름을 보여준다.
      l : 쉘의 터미널 장치의 이름을 보여준다.
      s : 쉘의 이름을 보여준다.
      t : 24시 형태의 현재 시간을 보여준다. (예 HH:MM:SS)
      T : 12시 형태의 현재 시간을 보여준다. (예 HH:MM:SS)
      @ : am/pm 12시 형태의 현재시간을 보여준다.
      u : 현재 사용자의 이름을 보여준다.
      w : 현재 작업디렉토리를 보여준다.
      W : 현재작업디렉토리의 마지막 디렉토리만 보여준다.
      ! : 현재 명령의 히스토리 넘버를 보여준다.
      : 를 보여준다.
 3) [posein@www posein]$ PS1="[u@t W]$ "
   [posein@00:53:51 posein]$
    => 프롬프트에서 호스트이름대신에 현재시간을 표시하도록 설정하였다.

3. 환경변수관련 명령
(1) set : shell변수를 표시하고 값을 지정할 수 있다. C-shell에서는 변수와 값지정시에 필수적으
      로 사용해야 하지만, Bash에서는 변수와 값지정시에 꼭 set 명령을 지정하지 않아도 된다.
 1) 사용법
  set [option] [argument]
 2) option
  -o : 현재 set옵션의 상태를 표시한다.
 3) 사용예
  ㄱ. set
    => 옵션이나 인자가 주어지지 않으면 이미 지정된 shell변수와 함수이름,값이 표시된다.
  ㄴ. set -o
    => 현재 set옵션의 상태가 표시된다.
 4) 응용예
  [posein@www posein]$ a=1          // bash에서는 set 명령없이 "변수=값" 형태로 지정
                              하면 된다. 확인은 인자없이 set 이라고 입력한다.
  [posein@www posein]$ echo $a
  1
   => 변수로 선언되었으므로 $a하면 1이라는 값이 출력된다.
  [posein@www posein]$ /bin/csh       // 임시로 C-shell로 전환.
  [posein@www ~]$
   => C-shell로 전환하면 프롬프트로 바뀜을 알 수 있다.
  [posein@www ~]$ b=2
  b=2: Command not found.
   => bash에서 변수지정하는 것처럼 하면 오류가 나타남을 알 수 있다.
  [posein@www ~]$ set b=2
   => C-shell 계열에서는 변수와 값지정시 set 명령을 사용해야 한다. 확인하려면 인자없이 set
    이라고 입력한다.
  [posein@www ~]$ echo $b
  2
    => 변수로 선언되었으므로 $b하면 2라는 값이 출력된다.

(2) env : 환경변수에 대한 정보를 보여준다.
 1) 환경변수란 : 로그인할 때나 새로운 쉘을 파생시킬 때 쉘의 환경을 정의하는 중요한 역할을
           수행한다. env를 실행하면 환경 변수 설정값들을 확인할 수 있고 또한 각 환경
           변수를 나타낼 때 변수이름앞에 $를 붙인다.
 2) 사용예
  [root@www /root]# env
   => 현재 시스템의 환경변수를 보여준다.
 3) 환경변수의 설정 : 값을 지정한후 export해야 한다. 현재 리눅스의 bash에서는 export를 생략
              해도 반영된다.
  예) 패스변경하기
    [posein@www posein]$ echo $PATH
    /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
      => 현재 패스를 확인하면 홈디렉토리를 없다. 홈디렉토리를 추가해보자.
    [posein@www posein]$ PATH="$PATH:/home/posein"
    [posein@www posein]$ export PATH
    [posein@www posein]$ echo $PATH
    /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin:/home/posein
(3) export : 쉘변수를 환경변수로 만들어주는 명령이다. 현재 리눅스 bash에서 일시적인 반영시에
        는 생략해서 사용할 수 있다.
 1) 사용법
  export 환경변수=변수값
 2) 사용예
  ㄱ. [root@www root]# export PATH="$PATH:/usr/local/apache/bin"
      => 현재 설정된 패스값에 /usr/local/apache/bin이라는 경로를 추가한다.
  ㄴ. [posein@www posein]$ PATH="$PATH:/home/posein"
      => 현재 설정된 패스값에 "/home/posein"이라는 경로를 추가한다. export명령을 생략해서
       사용해도 된다.
 3) 참고: export 명령은 쉘변수를 환경변수로 만들어 준다. 그러나, 쉘에서 export로 선언하여
      사용한 뒤에 로그아웃하게 되면 초기화된다. 따라서, 해당 환경변수의 값을 계속적으로
      반영되도록 하려면 /etc/profile(전체시스템)이나 ~/.bash_profile(개인사용자)파일안에
      선언하면 된다.

(4) unset : 선언된 변수를 제거하는 데 사용한다.
 1) 사용법
  unset 변수이름
 2) 사용예
  [root@www /root]# TEL=042
  [root@www /root]# echo $TEL
  042
  [root@www /root]# unset TEL
  [root@www /root]# echo $TEL  // 변수가 제거되었으므로 아무값도 출력되지 않는다.

(참고) bash에서는 환경변수를 만들 때 변수 값을 설정한 후, 환경에 변수를 익스포트(export)하는
    두 단계를 거친다.
 * 사용예
  [posein@www posein]$ echo $LANG     // 언어관련 환경변수값 확인
  ko_KR.eucKR
  [posein@www posein]$ date
  수 5월 21 01:28:56 KST 2003       // 한글로 표시된다.
  [posein@www posein]$ LANG=euc_UN    // 영어로 변경
  [posein@www posein]$ export LANG    // 일시적으로 변경할 경우에는 생략가능
  [posein@www posein]$ date
  Wed May 21 01:29:07 KST 2003       // 영어로 표시된다.


4. 명령어 히스토리(command history)
(1) history에 대하여
 1) 설명: bash에서는 입력하여 실행했던 모든 명령들은 히스토리 리스트 버퍼에 스택으로 저장된
      다. 이 기능은 반복하여 입력하거나 명령을 수정할 때 유용하게 쓰인다. 사용법은 방향키
      위/아래를 누르면서 사용가능하다. 히스토리 파일은 각 사용자의 홈 디렉토리에
      .bash_history라는 이름으로 존재하며 쉘 실행 중에는 메모리에만 명령어 히스토리를
      기억하고 있다가 로그아웃시에 .bash_history파일에 저장한다.
 2) 사용예
  [posein@www posein]$ history
   => 입력한 명령어들의 리스트를 보여준다.
(2) history 관련 변수
 1) 종류
  ㄱ. HISTSIZE : 히스토리 스택의 크기가 지정되어 있다. 단위는 명령의 개수이다. 이 변수의
            설정값을 변경했을 경우 history명령을 내리면 해당개수만큼만 출력된다. 또한
            방향키로 검색했을 경우에는 설정한 명령한 개수만 검색된다.
  ㄴ. HISTFILESIZE : 실질적인 히스토리파일의 크기이다.
  ㄷ. HISTFILE   : 히스토리 파일의 위치를 보여준다.
  ㄹ. HISTCONTROL : 중복되어지는 명령에 대한 기록 유무를 지정하는 변수이다.
 2) 사용예
  ㄱ. [posein@www posein]$ echo $HISTFILE
     /home/posein/.bash_history
  ㄴ. [posein@www posein]$ HISTSIZE=1
      => 실질적인 히스토리 파일의 스택크기가 1이 되므로 방향키로 조회해도 나오지 않는다.
(3) ! 과 히스토리 명령문 : 느낌표(!)를 이용하여 실행할 수 있다.
 1) 사용법
  !! : 마지막으로 실행했던 명령문을 실행한다.
  !n : n번째 실행한 명령문을 실행한다.
  !-3 : n번째 이전에 실행했던 명령문을 실행한다.
  !string : 가장 최근에 'string(문자열)'으로 시작하는 명령문을 실행한다.
  !?string? : 가장 최근에 실행했던 명령문중 string을 포함하고 있는 명령문을 실행한다.
          배포판에 따라 string뒤에 ?는 생략가능하다.
  ^string1^string2 : 마지막 실행 명령문의 string1을 string2로 대체한 후 실행한다.
 2) 사용예
  ㄱ. [posein@www posein]$ pwd
     /home/posein
     [posein@www posein]$ !!
     pwd
     /home/posein
      => pwd가 실행된다.
  ㄴ. [posein@www posein]$ !-4
     date
     수 5월 21 01:51:08 KST 2003
      => history 스택을 거슬러 4만큼 올라가서 해당 명령을 실행한다. 현재의 예제는 date
       명령임을 알 수 있다.
  ㄷ.[posein@www posein]$ !100
      => history의 번호중에서 100번 명령을 실행한다.
  ㄹ. [posein@www posein]$ set
     .....
     [posein@www posein]$ !s
      => 가장 최근에 's'로 시작하는 set명령이 실행된다.
  ㅁ. [posein@www posein]$ ls -alF
     .....
     [posein@www posein]$ !?al
      => ls -alF가 실행된다.
  ㅂ. [posein@www test]$ ls
     a.txt
     [posein@www test]$ cp a.txt b.txt
     [posein@www test]$ ^b.txt^c.txt
     cp a.txt c.txt
     [posein@www test]$ ls
     a.txt b.txt c.txt
(4) 참고 - history관련 테크닉
 1) [CTRL] + [r]
    => 명령프롬프트상태에서 이 키 조합을 누르면 검색할 수 있는 명령프롬프트가 뜬다. 이 때
     특정한 문자를 입력하면 가장 최근에 그 문자로 수행한 명령을 보여준다.
 2) [ESC] 후에 [.] 또는 [ALT] + [.]
    => 최근에 사용된 인자(argument)를 붙여준다. 텔넷으로 접속한 경우에는 [ALT]+[.]은 사용할
     수 없다.
 3) export HISTCONTROL=ignoreboth
    => 중복되어지는 명령어는 히스토리에 기억하지 않는다. 명령행에 입력하거나 계속적으로
     반영시키려면 .bashrc파일에 기록한다.

5. alias
(1) 개요 : 명령어에 별명(alias)를 만드는 것이다. 어떠한 명령에 기본으로 옵션을 추가시키거나
      자신만의 독특한 명령어를 만들 수 있다. 기본적으로 alias만 입력했을 경우에는 현재
      설정된 alias를 보여준다.
(2) 사용법
  alias 별명이름='실행될 명령의 정의'
(3) 사용예
 1) alias
    => 현재 설정된 alias를 보여준다.
 2) alias rm='rm -i'
    => rm명령에 기본으로 -i옵션을 부여하여 rm명령을 실행시킬때마다 확실히 지울 것인지 물어
     본다.
 3) unalias rm
    => rm에 설정된 ailas를 해제한다.
(4) 특징
  1) 일반쉘상태에서 alias를 설정한 뒤 로그아웃하면 그 설정은 무효가 된다.
  2) alias의 해제는 unalias명령을 이용한다.
  3) alias의 설정을 지속적으로 반영시키려면 ~/.bashrc파일안에 설정하면 된다.
(참고) ~/.bashrc파일안에 설정하면 다음 로그인부터 그 값이 반영된다. 만약 즉시 반영하고 원할
    경우에는 'source .bashrc'를 실행시키면 된다.



출처 - 오라닉스

2006/09/08 14:03 2006/09/08 14:03
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > seafig님의 블로그
원본 http://blog.naver.com/seafig/60005184191
아파치에서 전송 속도 제한하기 (모든 설명은 레드햇 6.0을 기준으로 합니다.)  

1. 아파치 1.3.x용 bandwidth 모듈이 필요합니다.  

ftp://ftp.cohprog.com/pub/apache/module/1.3.0/mod_bandwidth.c를  
받아  
오시면 됩니다. 레드햇 6.0 이상을 기반으로 한 배포판에는 이 모듈이  
포함되어 있습니다. /usr/lib/apache/mod_bandwidth.so가 이미 존제하는 분은  
컴파일 과정을 생략하시면 됩니다.  

참고: 레드햇에 포함된 버젼은 1.2 버젼입니다. 최신 버젼은 2.0 버젼이며  
다음의 설명들에 1.2 버젼에는 없는 기능의 경우에는 *로 마크를  
하겠습니다.  

2. 아파치 모듈로의 컴파일이 필요합니다.  

o 아파치 소스와 같이 컴파일 하려면 아파치 소스의 src/modules/extra/  
디렉토리로 mod_bandwidth.c를 복사한 후에 ./configure시에  
--add-module=mod_bandwidth.c 옵션을 주시면 됩니다.  

o 직접 컴파일 하려면 다음의 명령을 따라하시면 됩니다. 물론 그러기  
위해서는 아파치의 개발용 헤더들이 시스템에 설치되어 있어야 합니다.  
레드햇의 경우 apache-devel이라는 패키지로 존재합니다. 그 위치는  
/usr/include/apache/에 있습니다. (배포판에 따라 틀릴 수 있습니다.)  

$ gcc -c -I/usr/include/apache -O2 -m486 -fno-strength-reduce   
mod_bandwidth.c -fpic -DSHARED_MODULE mod_bandwidth.c  
$ gcc -shared -o mod_bandwidth.so mod_bandwidth.o  

$는 쉘 프롬프트를 나타내며 는 줄이 이어진다는 뜻입니다. 그러니까 한  
줄로 붙여 쓰시기 바랍니다.  

3. 컴파일된 모듈을 아파치 모듈이 위치하는 디렉토리로 옮기시기 바랍니다.  
레드햇의 경우 /usr/lib/apache/에 위치합니다. 직접 컴파일하셨다면 지정한  
것에 따라 틀릴 수 있습니다. 알아서 하시기 바랍니다. :)  

4. 아파치의 설정 파일을 고쳐야 할 것입니다. 그럼 하나씩 고치는 방법에  
대해서 알아 보겠습니다.  

1. 모듈로 컴파일 했기 때문에 모듈을 읽도록 해야 합니다. httpd.conf에서  
LoadModule foobar_modules modules/mod_foobar.so 같은 내용이 있는  
부분이 있습니다. 그 하단부에 다음 줄을 추가 하십시오.  

LoadModule bandwidth_module modules/mod_bandwidth.so  

마지막은 모듈의 위치입니다. 설치한 것에 따라 설정하십시오.  

httpd.conf 설정에 ClearModuleList가 있다면 다음 줄이 추가되어야  
합니다.  

AddModule mod_bandwidth.c  

비슷한 내용이 있는 부분의 아래에 적으시면 될 것입니다. :)  

2. 이제 전송 속도 제한 기능을 하는 모듈을 사용하겠다는 것을 지정해  
주어야 합니다. 디렉토리별 설정 위에 다음 줄을 추가하시면 됩니다.  

BandWidthModule On  

3. 이 모듈이 사용하기 위해서는 데이타를 기록할 장소가 필요합니다.  
기본값으로 /tmp/apachebw 디렉토리를 사용합니다.  

/tmp/apachebw/link  
/tmp/apachebw/master  

이렇게 디렉토리를 생성해 주시십시오. 퍼미션은 nobody 사용자가 쓸 수  
있는 권한이 있어야 합니다. (여기서 nobody는 아파치가 사용하는  
사용자입니다. 다른 사용자를 사용한다면 그 사용자의 권한으로 줘야  
겠지요.) 생각하기 싫으신 분은 다음 명령을 실행하십시오.  

chown root.nobody /tmp/apachebw  
chmod -R 770 /tmp/apachebw/  

4. 이제 실제적인 전송 속도 제한의 옵션을 알아 보겠습니다.  

BandWidth, LargeFileLimit, MinBandWidth 이렇게 세가지의 지시자?가  
있습니다. 각각에 대해서 알아 봅시다.  

o BandWidth  

문 법: BandWidth <도메인|IP주소|all> <속도>  
기본값: 없음  
사용처: 전체 설정, 디렉토리별 설정, .htaccess  

호스트에 따라 속도의 제한을 걸 수 있습니다. all은 모든 호스트에  
대해서 제한을 거는 것입니다. 도메인이나 IP주소로 접속 호스트를  
지정할 수 있습니다. 그리고 네트워크/마스크 포맷*으로 지정할 수도  
있습니다. (예: 192.168.0.0/24)  

속도는 Bytes/second로 나타냅니다. 0의 경우는 제한이 없는 것입니다.  

디렉토리별 설정에서 사용한 예를 들겠습니다.  


BandWidth 192.168.1 0  
BandWidth foobar.net 0  
BandWidth all 1024  


/home/httpd/html 디렉토리에서의 제한을 한 것입니다. 192.168.1.* IP  
주소를 가진 호스트와 *.foobar.net이라는 도메인명을 사용하는  
호스트에 대해서는 제한을 걸지 않으며 그 외 모든 접속에 대해서  
1024Bytes/sec으로 제한을 걸었습니다.  

o LargeFileLimit  

문 법: LargeFileLimit <파일크기> <속도>  
기본값: 없음  
사용처: 전체 설정, 디렉토리별 설정, .htaccess  

일정 이상의 크기를 가진 파일을 누군가가 받아 가려 할 때 그 속도의  
제한을 걸 수 있습니다. 파일크기는 KByte 기준이며 속도는 역시  
Bytes/secound입니다.  

LargeFileLimit 1024 4096  
LargeFileLimit 2048 2048  

위 예제는 1024 ~ 2047KB 크기의 파일을 받아가려 할 때 속도를  
4KB/sec으로 제한하고 2048KB 이상의 파일은 2KB/sec으로 제한을 하는  
것입니다.  

o MinBandWidth  

문 법: MinBandWidth <도메인|IP주소|all> <속도>  
기본값: all, 256  
사용처: 전체 설정, 디렉토리별 설정, .htaccess  

데이타 전송의 최저 속도를 지정하게 됩니다. 예를 들어서 설명하는  
것이 가장 좋을 것 같군요.  

BandWidth를 4096 (4KBytes/sec)으로 지정하고 MinBandWidth가 1024로  
지정이 되어 있을 때:  

- 지정된 호스트에서 하나만 접속할 경우, 4096bytes/sec이 최고의  
속도가 됩니다.  

- 지정된 호스트에서 두개가 동시에 접속할 경우, 각각의 세션에 대해  
2048Bytes/sec이 최고의 속도가 됩니다.  

- 더 많은 동시 접속이 일어나도 세션 당 최고 속도는 1024Bytes/sec  
이하로는 줄지 않습니다. (MinBandWidth 값이 1024기 때문에)  

MinBandWidth가 "-1"로 지정되면 모든 세션에 대해 최고 속도는  
BandWidth나 LageFileLimit에서 지정한 속도가 나올 수 있게 됩니다.  

BandWidth를 4096으로 지정하고 MinBandWidth가 -1이라면 동시에 지정된  
호스트에서 몇개의 접속을 하더라도 각 세션의 속도는 4096Bytes/sec  
까지 나오게 되는 것입니다.  
출처: 적수네
2006/09/08 14:02 2006/09/08 14:02
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2006/09   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)