RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'Linux'에 해당되는 글 112
출처 블로그 > Human Packet
원본 http://blog.naver.com/jabusunin/20012727557
많은 개발자들은 자신들이 개발하는 프로그램 소스의 버전을 유지하기 위해, 원소스 외에 패치파일을 준비한다. 일반적으로 패치파일은 diff를 사용해서 작성하고, 해당 패치파일을 적용할 때는 patch 명령어를 사용해 패치적용을 완료한다.
필자는 처음에 커널 공부를 할 때, 패치파일 사용으로 어려움을 겪은적이 있다. 실제 버전업된 커널 소스 파일 전체를 받는게 나은지, 아님, 하나의 커널 소스 파일을 받고, 패치 파일만 받는게 낳은지 잠시나마 고민했던 적도 있다.
따라서, diff 와 patch 파일은 커널에만 관련있는 내용은 아니나, 커널 패치와 유용히 사용될 수 있는 명령어이므로, 아래에서 살펴보고자 합니다.
기본 개념 및 사용법은 아래의 설명을 따라하기 식으로 해보면, 이해할 수 있을겁니다.

  • Diff 사용법

    1. 두개의 빈 파일을 생성합니다.
    [css@css ~]$ touch aaa bbb
    [css@css ~]$ ls
    aaa bbb


    2. aaa에 아래의 라인을 추가합니다. (vi 사용법은 애플리케이션 소개란을 참고하세요. ^^)

    [css@css ~]$ vi aaa

    This is first line // 라인을 추가합니다.



    3. aaa 를 bbb로 복사하고, 새로운 라인을 추가합니다.
    [css@css ~]$ cp aaa bbb
    [css@css ~]$ vi bbb
    This is a first line
    This is a second line // 라인 추가


    4. aaa와 bbb의 변경 부분을 패치파일로 만듭니다. 그리고, 변경되는 부분이 패치파일에 어떻게 저장되나 확인합니다.
    [css@css ~]$ diff -urN aaa bbb > mydiff.patch
    [css@css ~]# cat mydiff.patch
    --- aaa 2005-03-07 20:23:22.566188880 +0900
    +++ bbb 2005-03-07 20:23:32.986604736 +0900
    @@ -1 +1,2 @@
    this is a first line
    +this is a second line


    5. bbb를 지우고, 패치파일의 내용을 aaa에 적용시킵니다.
    [css@css ~]$ rm -f bbb
    [css@css ~]$ patch -p 0 < mydiff.patch
    patching file aaa


    6. aaa에 패치파일의 내용이 적용되었나 확인합니다.
    [css@css ~]$ cat aaa
    this is a first line
    this is a second line // 라인이 추가되었음


    위의 예제에서는 diff와 patch 명령어의 사용과 개념을 이해하기 위해 간략히 설명했지만,
    실제 소스의 크기가 상당한 경우, 원소스(aaa)를 가지고, 패치파일만 가지고 작업합니다.

    그럼, diff와 patch의 기본 개념 및 사용법을 이해했으니, 커널과 관련되어 알아보도록 하지요..


  • 커널 패치파일 만들기
    일반적으로 커널에 자신만의 변경 내용을 담고자 하고, 그 패치를 제공하고자 하면, 아래의 방법 대로 하시면 됩니다.

    1. 바닐라 커널 소스를 준비한다. (kernel.org 에서 다운로드

    2. 커널 소스의 복사본을 준비하고, 해당 소스에 변경을 가한다.
    [root@css kernels]# cp -a linux-2.6.9 linux-2.6.9-my
    Linux-2.6.9-1 디렉토리내 원하는 부분 소스 수정


    3. 소스 수정이 끝나면, 패치파일을 작성한다.
    [root@css kernels]# diff -urN linux-2.6.9 linux-2.6.9-my > mykernel.patch
    [root@css kernels]# gzip -9 mykernel.patch(보통 커널의 경우, 패치파일도 사이즈가 크므로, 압축을 합니다.)
    [root@css kernels]# ls
    linux-2.6.9 linux-2.6.9-my mykernel.patch

    gzip으로 압축하면, mykernel.patch는 mykernel.patch.gz으로 파일명이 변경됩니다.

    4. 원소스에 패치 적용을 한다.

    [root@css kernels]# pwd
    /usr/src/
    [root@css kernels]# ls
    linux-2.6.9 linux-2.6.9-my mykernel.patch
    [root@css kernels]# patch ?p 0 < mykernel.patch (패치 파일이 압축되지 않은 경우)
    [root@css kernels]# gzip ?cd mykernel.patch.gz| patch ?p0 (패치 파일이 압축된 경우. 압축을 풀고 패치 적용)


    커널과 관련해, diff/patch 명령어를 알아보았습니다. 위의 명령어 설명은 기본적인 내용만 다루었습니다.

    실제 리눅스에서 자주 언급되는 커널이 어떠한 것이 있는지, 자세한 명령어 활용은 어떻게 되는지는 다음에 다시 글을 올리겠습니다.

  • 2006/09/08 14:10 2006/09/08 14:10
    이 글에는 트랙백을 보낼 수 없습니다
    Linux  2006/09/08 14:09
    출처 카페 > DBexpert(Unix와D.. / tingsnut
    원본 http://cafe.naver.com/dbexpert/37
    리눅스를 사용하면서 내가 깜박 깜박 잊어버리는 자잘한 팁을 모았음. 검색이 어려우면 키워드로 검색할 것.


    내용


    GUI
    DESKTOP X Window선택
    X Window에서 해상도 조절
    X window 해상도를 설정하려면
    ami실행 후 메뉴가 깨져 있을 때
    ami실행 후 한영키를 사용하고 싶은 경우
    휠마우스에서 휠이 작동을 안할 때
    원격에서 리모트서버의 X application실행시
    폰트서버 설정
    KDE 3.x 버전에서 윈도우용 트루타입 폰트를 못 찾는 경우
    한텀(hanterm) 타이틀바에 디렉토리 경로 보이게 하기
    Pacakge 관리
    RPM 관련 커맨드
    rpm package설치시 상호의존성이 얽혀있을 땐 한 command로 설치
    필요없는 rpm지우기
    레드헷 8.0에서 up2date 사용하기
    Network
    Network 설정 파일들
    급하게 Network설정을 해야할 경우
    하나의 랜카드에 여러개의 ip추가하기
    열린 포트를 사용하는 프로세서를 확인하려면
    ping 무시하기
    TCP/IP속도 증가시키기
    VI
    vi 에디터 내에서 ^M을 입력하려면
    vi 에데터 내에서 ^M을 없애려면
    vi에서 라인끝 빈칸 지우기
    vi에서 벨소리 제거
    vi에디터에서 삭제/복사 간편하게
    vi에디터에서 어떤 문자열을 찾고자 할 때 대소문자 안가리게 하려면
    vi에디터에서 '숫자'만큼의 컬럼으로 이동
    vi에서 화면 나누기
    파일 네비게이션
    vi내에서 파일 네비게이션 바 만들기
    여러개의 파일 편집하기
    vi로 파일비교
    잠시 쉘로 나가기
    vi에서 자동들여쓰기를 안하려면
    vim 의 syntax 기능에서 underline 없애기
    윈도우에서 작성한 한글이 페도라2(Fedora Core2) 에서 깨져보일 때
    즐겨쓰는 option들
    more로 파일보다가 vi로 넘어가기
    vi를 hex editor로
    System 관리
    Swap공간을 알려주는 명령어 (process check)
    현재 디렉토리가 차지하는 용량 보기
    run-level을 변경하려면
    CPU정보를 알고 싶다면
    MEM정보
    특정 데몬이 띄워져 있는지 확인하려면
    현재 구동중인 데몬을 트리형식으로 보려면
    시스템 부하상태 보기
    shell을 vi 스타일로
    최신 커널버전 알기
    prompt에 full path 표시를 하고싶다면
    log파일에서 내용만 지우기
    현재 연결되어 있는 TCP port보기
    LILO에서 싱글부팅
    grub에서 싱글부팅
    하위 디렉토리까지 문자열 검색하려면
    world writable file 찾기
    ext2에서 ext3로 업그레이드 하기
    logon기록을 보려면
    remote환경에 있는 윈도우 폴더 마운트하기
    터미널에서 디렉토리, 파일 색상 변경
    서브 디렉토리까지 한번에 생성
    alias 적용안하기
    이동한 바로 직전의 디렉토리로
    일정기간 동안 접근하지 않는 파일 삭제하기
    setuid가 설정된 루트쉘 검색
    MySQL Connection Failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111) 에러가 나는 경우
    특정 유저만 su 허락하기
    작업중 로그인 막기
    크기가 가장 큰 파일, 디렉토리 찾기
    현재 디렉토리의 크기만을 파악할때
    시스템 정보 감추기
    메모리를 가장 많이 잡아먹는 프로세스 알아내기
    FTP로 들어온 사용자 확인하기
    원하지 않는 사용자 죽이기
    몇일 이상된 파일만 mv또는 cp
    터미널에서 백스페이스를 누르면 ^H 와 같은 이상한 문자가 출력되는 현상
    텔넷이나 ftp 외부 사용시 root로 접속 가능하게 하는 방법
    여러 파일 안에 있는 내용중 특정단어를 바꾸고 싶을 때
    윈도우 디렉토리 마운트후 한글 디렉토리가 깨져보일 때
    tail 명령어 활용
    shell prompt 변경하기
    kernel 파라미터 조정하기
    사용자별 du -h 값 보기
    하룻동안 만들어진 파일 검색하기
    apache 설정 파일 문법 오류 검색
    레드햇 패키지 버전을 알고 싶을 때
    새로운 배포본 설치를 위한 Multi LILO
    Rebooting 키 제한을 위한 설정
    하드디스크 I/O 튜닝
    Core 파일 디버깅
    CPU부하와 메모리 사용 정보
    Fedora Core2에서 한글 인코딩 바꾸기
    Fedora2에서 한글man page 깨지는 현상에 대한 해결책



    1 GUI1.1 DESKTOP X Window선택  #vi /etc/sysconfig/desktop
       
        DESKTOP = "GNOME" or "KDE"

    1.2 X Window에서 해상도 조절CTRL + ALT + "+"(Num Lock key)
    CTRL + ALT + "-"




    1.3 X window 해상도를 설정하려면  /etc/X11/XF86Config-4  (symbolic link되어 있음)
     Screen section의 MODE
      "800*600" "1024*768" "1152*864"


    1.4 ami실행 후 메뉴가 깨져 있을 때#export 해서 LANG 와 XMODIFIERS 변수를 확인하라.


    1.5 ami실행 후 한영키를 사용하고 싶은 경우xev를 실행해서 한영키의 키코드를 알아낸다. 예를 들어 한영키가 122, 한자키가 121이면 /etc/X11/Xmodmap 파일에 다음을 추가시킨다.

    ! i386 and alpha  
    keycode 22 = BackSpace  
    keycode 107 = Delete  
    keycode 121 = Hangul_Hanja  
    keycode 122 = Hangul  

    X를 재실행하거나 재실행시키고 싶지 않다면
    #xmodmap /etc/X11/Xmodmap 을 실행


    1.6 휠마우스에서 휠이 작동을 안할 때휠기능을 작동시키려면  /etc/X11/XF86Config-4  를 수정한다.

    Section "InputDevice"
           Identifier  "Mouse0"
           Driver      "mouse"
           Option      "Protocol" "PS/2"
           Option      "Device" "/dev/psaux"
           Option      "ZAxisMapping" "4 5"
           Option      "Emulate3Buttons" "yes"
    EndSection  

    바로 이 부분
    Option   "Protocol" "PS/2"  을
    Option   "Protocol" "IMPS/2"  로 고치면 휠을 사용할 수 있다. 만약 다음 부분
    Option      "ZAxisMapping" "4 5"  이 없다면 추가시킨다.
    그리고 X window를 재시작하는 것을 잊지 않도록 한다.


    1.7 원격에서 리모트서버의 X application실행시서버측: xhost +클라이언트ip (xhost + 는 모든 주소에 대해 원격접속 허용)
    클라이언트측: export DISPLAY=서버ip:0.0


    1.8 폰트서버 설정클라이언트측에서 Xmanager를 이용해 리눅스 서버에 접근하려면 서버에 폰트서버가 실행되고 있어야 한다. 폰트서버는 xfs데몬을 말하는 것으로 그냥 띄우면 되고 단지 /etc/X11/XF86Config에서

    FontPath "/usr/X11R6/lib/X11/fonts/TrueType"
    # FontPath "unix/:-1"

    FontPath "unix/:7100" 로 주석부분을 고쳐주면 된다. 그럼 7100포트가 열린다. 그리고 그서버와 포트를 지정하면 폰트서버가 타 x서버에서 사용가능하다.


    1.9 KDE 3.x 버전에서 윈도우용 트루타입 폰트를 못 찾는 경우from KLTP
    최근에 나온 레드햇8을 쓰고 있는데요 윈도우용 폰트를 가져다 쓰고 있습니다. 그런데 KDE에서 새로 추가한 윈도우용 트루타입폰트를 찾지 못하는 문제가 있더군요. xfontsel에서도 인식하고 셋팅역시 제대로 되어서 GTK나 Motif로 만들어진 다른 어플리케이션에서는 모두 인식하나 KDE에서는 백묵 글꼴만 나오고 윈도 폰트는 아예글꼴 리스트에 나오지도 않더군요. 해결책이 딴데 있더군요.

    KDE가 QT 라이브러리로 만들어진 것이라 "혹시 QT셋팅에 문제가 있는것은 아닐까" 라는 생각을 하고 Qt config를 살펴봤습니다. QT Config에 Anti aliase font지원을 꺼 봤더니 제대로 동작하더군요. 아마도 QT내지는 XFS 자체의 버그인 것 같습니다. 간단히 말씀드리자면 qtconfig3를 실행시켜 Font탭에서 Enable Anti-Aliased Font Support를 꺼 주시고 X를 재시작 하시면 윈도우용 굴림 폰트를 KDE에서 이용하실 수 있습니다. --Kid A



    1.10 한텀(hanterm) 타이틀바에 디렉토리 경로 보이게 하기자신의 .bash_profile에 다음을 추가하면 한텀의 타이틀바에 <사용자ID>@<호스트명>:<디렉토리명>의 형식으로 나타나게 된다.

    function proml
    {
      case $TERM in
        xterm*)
        local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
                 ;;
                 *)
                 local TITLEBAR=''
                 ;;
        esac
        PS1="${TITLEBAR}\n] \u@\h ]"
    }
    proml


    2 Pacakge 관리2.1 RPM 관련 커맨드#rpm -qa : 현재 설치된 package출력
    #rpm -qil mtools | less : mtools에 관한 package정보
    #rpm -qif /etc/bashrc : /etc/bashrc파일이 속한 package




    2.2 rpm package설치시 상호의존성이 얽혀있을 땐 한 command로 설치  #rpm -Uvh [package1] [package2] [packag3] .......

    의존성을 무시하고자 할 땐 --nodeps option사용




    2.3 필요없는 rpm지우기만약 MySQL을 설치 하였다고 하자.


    MySQL-3.23.33-1.i386.rpm* MySQL-devel-3.23.33-1.i386.rpm*
    MySQL-client-3.23.33-1.i386.rpm* MySQL-shared-3.23.33-1.i386.rpm*


    그리고 이것을 지우려면 ?


    rpm -e `rpm -qa | grep MySQL`  

    또한 대소문자를 구분하지 못한다면?


    rpm -e `rpm -qa | grep -i mysql`  

    이라고 써도 된다.

    이때 ` 기호는 숫자 1번 왼쪽에 있는 백쿼터이다.


    패키지명과 버젼이 동일한 패키지가 여러개 존재할때 삭제하는 방법


    rpm -e 패키지명 --allmatches

    2.4 레드헷 8.0에서 up2date 사용하기from KLTP
    레드헷 8.0 설치하고 up2date을 사용하려 하니 황당한 에러가 나와서 해결하고 나서 올립니다.
    레드헷 8.0 에서는 설치후에 [일반관리자용] setup 에서 서비스 보시면, rhnsd 가 있는데 이거 활성화 시켜 주시고요..(그냥 참조용임) 바로 up2date --register 하시면 접속해서 등록해서 바로 사용할 수 있습니다.

    /etc/rc.d/init.d/rhnsd restart 하시면 됩니다.


    이후 up2date * 하시면 됩니다. 그런데, 이런 에러가 나오시는분....


    There was an SSL error: [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]  

    이게 SSL 에러냐.. 절대 아닙니당.. 저도 처음에 그런줄알고 패키지 문제 인줄 알고 의존성 찾아보고, 삽질했습니당.결국에 알아낸것은 시간이 일치 하지 않는 다는 결론을... 이건 구글에서 검색했는데, 누군가 시간차를 적어 놓았더군요... 혹시 해서...

    rdate -s time.kriss.re.kr  

    해서 다시, up2date --register 해보니... 헐 아주 잘 되네염... --박성훈


    time.kriss.re.kr은 사용하지 마세요. 제가 예전에 서버들 간의 시간동기화를 하기위해서 time.kriss.re.kr 사용했다가 아주 크게 쓴맛을 보았습니다. 표준연의 타임서버가 갑자기 죽고나서 정확한 시간으로 셋팅되는 것이 아니고 OS상에서 존재하는 가장 처음의 시간, 기억은 1960년대의 시간으로 셋팅 되는 바람에 중요한 데이터들간의 시간동기화에 문제가 생겨서 데이터를 몽땅 버린 적이 있습니다. 제가 추천하는 time 서버는 ntp를 사용하는 것입니다. time.datum.com, kr.public.ntp.get-time.net unix 계열의 OS에서는 ntp 관련 S/W를 설치하시면 됩니다. 그러면 이만... --익명



    이번에 레드헷 9.0을 설치하고 업데이트 하려고 하니 위으 에러메세지가 나오더군요! 그래서 시간을 동기화 했는데도 마찬가지 입니다. 그래서 레드헷 사이트에 가니 관련 RPM패키지를 받아 재설치 하라고 하네요 레드헷 사이트에 가서 새로운 up2date 관련 RPM을 받아 새로 설치 하시기 바랍니다. --호종기




    3 Network3.1 Network 설정 파일들  /etc/hosts                                : localhost 및 server name
     /etc/resolv.conf                          : name server
     /etc/sysconfig/network                    : HOSTNAME
     /etc/sysconfig/network-scripts/ifcfg-eth0 : IP, Netmask, Gateway등등

    설정이 끝났다면
    #/etc/rc.d/init.d/network restart  또는
    #service network retart  3.2 급하게 Network설정을 해야할 경우#ifconfig eth0 <ip_addr> netmask <netmask> up
    #route add default gw <gw>
    #cat > /etc/resolv.conf
    nameserver <DNS_addr>
    CTRL-D

    #ping dongwoo.org


    3.3 하나의 랜카드에 여러개의 ip추가하기from KLTP
    ◎아이피추가는
    1) ifconfig eth0:0 아이피 netmask 아이피 broadcast 아이피 up
    2) cd /etc/sysconfig/network-scripts
    3) /etc/sysconfig/network-scripts/에 있는 ifcfg-eth0을 복사, 파일명을 ifcfg-eth0:0
    4) vi로 열어 Device=eth0:0, ipaddr=원하는 아이피 주소
    5) ./ifup eth0:0
    6) /etc/rc.d/init.d/network restart

    계속 추가시에는 eth0:1, eth0:2....등등으로 한다. 재부팅해보고 ifconfig를 해봐서 추가되었는지 확인한다.


    ◎아이피 삭제는
    1) ifconfig eth0:0 아이피 netmask 아이피 broadcast 아이피 down
    2) cd /etc/sysconfig/network-scripts
    3) rm ifcfg-eth0:0
    4) /etc/rc.d/init.d/network restart


    재부팅해보고 ifconfig해봐서 삭제되었는지 확인한다. 참고로 레드햇 8.0에서 셋팅함



    3.4 열린 포트를 사용하는 프로세서를 확인하려면if #3306 port is opened

     #fuser -n tcp 3306    -> show PID
     #ps -ef | grep [PID]

    3.5 ping 무시하기echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
    echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all


    3.6 TCP/IP속도 증가시키기TCP/IP의 속도를 실제로 증가 시키는 것은 아니구요. 디폴트 값을 낮게 해서, 좀 더 많은 연결이 동시에 제어될 수 있도록 하는 방법이랍니다. 리눅스 박스가 연결을 닫는데 드는 시간을 줄여주고, 불안정한 열결을 끊기전에 시간을 줄여 줍니다. 또한 필요없는 IP 확장을 꺼 놓음으로서 체감 속도를 훨씬 빠르게 해 줄 것입니다.

    echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout  
    echo 1800 >/proc/sys/net/ipv4/tcp_keepalive_time  
    echo 0 > tcp_window_scaling  
    echo 0 > tcp_sack  
    echo 0 > tcp_timestamps  


    4 VI4.1 vi 에디터 내에서 ^M을 입력하려면  CTRL + V --> CTRL + M
                  ^T ^] 은 각각 CTRL + T  CTRL + ]

    4.2 vi 에데터 내에서 ^M을 없애려면   :0,%s/^M//g  (^M : CTRL-v, CTRL-m)

    4.3 vi에서 라인끝 빈칸 지우기   :g/^$/d

    4.4 vi에서 벨소리 제거:set vb


    4.5 vi에디터에서 삭제/복사 간편하게  :10, 20d
      10번째줄에 가서 ma 누르고 20번째줄에 가서 d'a (삭제)  y'a (복사)  

     :'a,.co.
       'a부터 .까지 .밑에 copy

    4.6 vi에디터에서 어떤 문자열을 찾고자 할 때 대소문자 안가리게 하려면:set ic


    4.7 vi에디터에서 '숫자'만큼의 컬럼으로 이동숫자|


    4.8 vi에서 화면 나누기   :split [file]  <-- 수평
      :vs [file]     <-- 수직
     
     화면간 이동을 하려면 CTRL + w , ijkl


    4.9 파일 네비게이션#vi ./ <--- 현재 디렉토리 내용을 네비게이션


    4.10 vi내에서 파일 네비게이션 바 만들기:20vs ./
    열기를 원하는 파일에 가서 shitf + o



    4.11 여러개의 파일 편집하기   #vi file1 file2 file3 .....

     :n      <---- 뒤의 파일 편집으로
     :e#     <---- 앞의 파일 편집으로


    4.12 vi로 파일비교 #vi -d file1 file2  

    4.13 잠시 쉘로 나가기CTRL + z

    다시 vi로
    #fg



    4.14 vi에서 자동들여쓰기를 안하려면:se(t) nocindent
    :se(t) nosmartindent (nosi)
    "se(t) noautoindent (noai)


    4.15 vim 의 syntax 기능에서 underline 없애기리눅스에서 터미널을 열어서 vi 작업을 한다면 syntax 기능을 사용하는데 별다른 어려움이 없을것이다. 하지만 telnet 으로 접속해서 사용하는 경우에 color 를 표시할 수가 없는 경우엔 해당 syntax 가 보통 underline 으로 표시된다. 그런데 이 underline 때문에 소스코드를 보기가 힘들경우가 있다.

    이 글에서 다룰 내용은 다음과 같다. highlight 기능 과 colorscheme 사용.


    vi 를 연 상태에서


    :sy[tax] on  

    을 켠다. 여기서 [] 안의 내용은 옵션이다. 안써도 된다. 그리고 다음과 같이 하면 현재 사용하는 highlight 목록을 살펴 볼수 있다.

    :hi[ghlight]  

    이 색깔에 대한 정의는 다음에 정의 되어 있다.

    :!echo $VIMRUNTIME/colors  

    위 디렉토리 아래에 가보면 morning.vim, evening.vim 등의 파일들이 보이는데 각각 color scheme 를 정의해 놓은 파일들이다. 다른 color scheme 로 바꾸고 싶다면 다음과 같이 한다.

    :colorscheme evening  

    여기서 evening 는 scheme 이름이다.
    그럼 이제 underline 을 없애도록 하겠다. 현재 telnet 접속하여 vim 을 사용하고 있다는 가정하에 하는 것이다. 콘솔에서 사용하는 사람은 대개 underline 이 나오지 않을것이다.

    :hi  

    위와 같이 하면 다음과 같이 출력이 된다.

    Type term=underline ctermfg=2  
    Constant term=underline ctermfg=4 guifg=Magenta  

    여기서 Type 이라고 쓰여진 첫 필드는 group-name 이다. 만약 당신이 C 코드를 열고 있다면 Type 은 말그대로 char, int, float... 등과 같은 Type 이다. term 은 color 를 표시할 수 없는 터미널이다. term 에선 underline 으로 표시하겠다는 뜻이다. ctermfg 는 color terminal 이다. fg 는 foreground 이다. 번호는 색깔을 나타낸다. 즉, color 를 표시할 수 있는 터미널에선 2번 컬러로 Type 을 표시한다. 색깔은 숫자가 아니라 직접 명시를 할 수도 있다. ctermfg=blue 이런식이다. 그럼 상수를 표시할때 term 에선 bold 로 표시하도록 해보자.

    :hi Constant term=bold ctermfg=4  

    아무런 설정도 하고 싶지 않다면 bold 대신에 NONE 라고 사용하면 된다.

    위와 같은 설정들은 ~/.vimrc 에 저장하여 사용할 수도 있다.


    shell> cat -n ~/.vimrc  

    1 set ic  
    2 set nu  
    3 set softtabstop=4  
    4 set shiftwidth=4  
    5 set formatoptions=croql  
    6 set ruler  
    7 set showmode  
    8 set smartindent  
    9 syntax on  
    10 filetype indent on  
    11 map <F2> :w<cr>:!gcc -Wall % -o %< && ./%<<cr>  
    12 map <F3> :<CR>:!./%<<CR>  
    13 map <F4> :so $VIMRUNTIME/syntax/2html.vim<CR>  
    14  
    15 colorscheme pablo  
    16 hi Type term=NONE ctermfg=2  
    17 hi PreProc term=NONE ctermfg=10  
    18 hi LineNr term=NONE ctermfg=6  
    19 hi Constant term=NONE ctermfg=14  

    15번째 라인부터가 highlight 설정이다. 1번째 라인부터 10번째 라인은 기본적인 설정들에 대한 내용이다. 11번째에서 13번째 라인은 mapping 기능으로 <F2> 를 누르면 C 코드를 컴파일 한후 실행하고 <F3> 를 누르면 컴파일된 바이너리를 실행만 한다. <F4> 를 누르면 현재 파일을 HTML 파일로 변환하여 준다. --linox


    4.16 윈도우에서 작성한 한글이 페도라2(Fedora Core2) 에서 깨져보일 때윈도우에서 작성한 문서를 페도라2에서 열어보면 한글이 다 깨져보이는 수가 있다. 이는 encoding 차이때문인데 윈도우에서 저장한 파일은 기본적으로 euckr로 인코딩된다. Fedora Core2는 utf-8방식을 사용하기 때문에 파일을 컨버전해야 한다. 방법은 2가지다

    1. 파일을 utf-8로 인코딩함


    $iconv -f euckr -t utf-8 a.euckr.txt > a.utf-8.txt

    2. 에디터 프로그램의 보기에서 encoding을 euckr로 바꿔준다. (vi는 지원함)



    4.17 즐겨쓰는 option들set fileencodings=euc-kr
    set encoding=cp949
    set nowrap
    set listchars=extends:>,precedes:<
    set shiftwidth=4
    set tabstop=4
    set visualbell t_vb=
    set autoindent
    set tag=$HOME/tags,$HOME/server/tags
    set fdm=marker
    set vb

    그외 팁으로, dos에서는 줄바뀜이 \r\n
    unix에서는 \n
    mac에서는 \r
    그런데 vi에서 텍스트 파일을 유닉스 스타일로 변환해서 저장할 수 있다.


    :set ff=unix  
    :w  

    해주면 dos형태의 파일을 unix로 변환된다. unix, dos, mac을 넣을 수가 있다. vim만의 기능이며 nvi, vi는 안된다.


    4.18 more로 파일보다가 vi로 넘어가기보통 more로 파일을 보는경우가 많다. 그런데 수정을 하려고 하면 more를 종료하고나서 다시 vi로 들어 그러나 more로 파일을 보다가 키보드에서 v를 입력하면 바로 vi로 전환된다. 다시 빠저나오면 다시 more로 전환된다.


    4.19 vi를 hex editor로vi는 텍스트 편집기뿐 아니라 hex editor의 기능도 가지고 있다.
    다음과 같은 커맨드로 hex editor로 변경할 수 있다.

    :%!xxd

    다시 원래 텍스트 편집 기능으로 돌아가려면,

    :%!xxd -r  


    5 System 관리5.1 Swap공간을 알려주는 명령어 (process check)#top




    5.2 현재 디렉토리가 차지하는 용량 보기# du -s -h



    5.3 run-level을 변경하려면#telinit 5



    5.4 CPU정보를 알고 싶다면#arch



    5.5 MEM정보#free



    5.6 특정 데몬이 띄워져 있는지 확인하려면#ps aux | grep httpd



    5.7 현재 구동중인 데몬을 트리형식으로 보려면#pstree



    5.8 시스템 부하상태 보기#uptime



    5.9 shell을 vi 스타일로#set -o vi



    5.10 최신 커널버전 알기#finger @finger.kernel.org
    #finger @kernel.org




    5.11 prompt에 full path 표시를 하고싶다면  #vi /etc/bashrc

     PS1 = [ ..... ]
     \U  : User
     \h  : Host
     \W  : 사용자가 위치하는 경로의 최 하위디렉토리
    여기서 \W -> \w

    5.12 log파일에서 내용만 지우기#>log_file




    5.13 현재 연결되어 있는 TCP port보기#netstat -t (-nlt : 열려있는 포트확인)




    5.14 LILO에서 싱글부팅#vmlinuz root=/dev/hda9 single : /dev/hda9에 리눅스로 single booting




    5.15 grub에서 싱글부팅- grub메뉴에서 e를 누릅니다. (edit)
    - edit 화면에서 화살표키로 "kernel /boot/vmlinuz-xxxx" 로 옴깁니다.
    - 다시 e키를 누르면 명령어 줄이 나옵니다. 끝에 한칸띄우고 single이라 고 적고
    enter를 누릅니다.
    kernel /boot/vmlinuz-2.2.17-5mz /dev/hdax single [enter]
    - 하시고, b를 눌러서 booting을 합니다.

    5.16 하위 디렉토리까지 문자열 검색하려면  grep -rl [문자열] *

    r 옵션이 없다면



     find . * -exec grep -n [문자열] {}\; -print

    더 짧고도 효과적인 방법


    grep "string"'find . -type '

    그런데 이는 조건에 맞는 파일의 개수가 많아지면 쉘의 명령행 버퍼의 범위를 벗어나므로 문제가될 소지가 있다. 명령행 버퍼의 오버플로우를 방지하기 위해선 다음과 같이 하면 된다.

    find . -type f | xargs grep "string"

    그런데 이 방법은 파일 이름에 공백이 들어갈 경우 문제가 생길 수 있다. 그럼 다음과 같이 해보자.

    find . -type f -print0 | xargs -0 grep "string"

    find는 심볼릭 링크된 디렉토리에 대해서는 기본적으로 검색을 실시하지 않으니 -follow옵션을 사용해야할 경우도 있다는 것을 알아둔다.


    명령행 버퍼오버플로우를 방지하는 방법은 다음과 같은 방법도 있다.


     find . -type f -exec grep -l"string" {}\;
     
    grep에서 '-l'옵션은 string을 포함하는 파일명을 나타내준다. 이런 검색을 특정 파일들에 대해서 행하기 위해서는 -type와 -name옵션을 쓸 수 있다.

     find . \(-type f -name "*\.html"\) -exec grep -l "string" {}\;
     
    이것은 html의 확장자를 가지는 모든 파일에 대해서 "string"을 포함하는지 알아보고 포함하고 있는 파일명을 출력해준다.


    위의 방법들은 "어떻게 서브디렉토리에 있는 파일들에 대해서 grep을 실행해줄 수 있는가?"하는 문제에 관한 여러 가지 방법들은 매우 유용하긴 하지만 검색을 실시하는 디렉토리에 바이너리 파일이 있을 경우에는 터미널을 제어하지 못하는 문제가 생길 수 있다. 왜냐하면 바이너리 파일의 몇몇 제어 문자들(Control Characters)이 터미널을 그래픽 모드로 바꿔놓을 수 있기 때문이다. 물론 이렇게 되었을 경우 터미널을 다시 바로잡는 방법이 있긴 하지만 아무래도 가장 좋은 방법은 그러한 일이 없도록 처음부터 방지하는 것이 가장 좋을 것이다.
    이제 화면에 찍혀나올 수 없는 문자들을 모두 없애보자. 어쨌든 읽을 수는 없지만 다음과 같은 명령을 내려보라.


    sed -e 's/[^-~][^-~]*//g'

    이 명령은 화면에 출력될 수 없는 (제어) 문자들을 그냥 스페이스들로 바꿔 버린다. 이 명령은 파이프를 이용하여 쉽게 다른 명령어들과 결합해서 사용할 수 있다. 여기 간단한 쉘 스크립트가 있다. 이것을 grepfind라고 이름붙여서 사용할 수 있다.

    #!/bin/sh
    #save this in a file called grepfind and do a "chmod 755 grepfind"
    #
    if test $@ = 0 -o "$1" = "-h" -o "$1" = "-help" ; then
    echo 'grepfind  ─ recursively descends directories and egrep all files '
    echo  
    echo 'Usage: grepfind [-help][-h](start_directory] egrep_search_pattern'
    echo
    echo 'The surrent directory is used as start_directory if parameter'
    echo 'start_directory is omitted. The search is case insensitive.'
    echo 'Multiple occurrences of control characters are replaced by a single'
    echo 'space. This makes it possible to grep around in files that contain'
    echo 'binary data and strings without setting the terminal accidently'
    echo 'to graphics mode.'
    echo
    echo 'Example : grepfind/home "hello world"
    else
    if ["$2" = "" ];then
    find . -type f -exec egrep -i "$1" /dev/null {} \;|sed -e 's/[^-~][^-~]*//g'
    else
    if [-d "$1" ] ;then
     find $1 -type f -exec egrep -i "$2" /dev/null {} \;|sed -e 's/[^-~][^-~]*//g'
    else
     echo "ERROR: $1 is not a directory"
    fi
    fi
    fi
    #_END_OF_grepfind


    5.17 world writable file 찾기  #find / -type f -perm -2 -exec ls -lg {} \;

    world writable directory 찾기



     #find / -type d -perm -2 -exec ls -ldg {} \;

    5.18 ext2에서 ext3로 업그레이드 하기  #mke2fs   -j /dev/hda[X] (X: disk number)
     #tune2fs     "
     
     ext3에서 ext2로 다운그레이드 하기
     #debugfs
     #open -f -w /dev/hda[X]
      features
      features -has_journal -needs_recovery
      quit


    5.19 logon기록을 보려면#last




    5.20 remote환경에 있는 윈도우 폴더 마운트하기/etc/fstab 에 물론 마운트 정보 입력



     //win_pc/win_folder /linux/mount/point smbfs user,noauto,username=Winuser_name 0 0

    5.21 터미널에서 디렉토리, 파일 색상 변경/etc/DIR_COLORS

    if you use xterm,
    /etc/DIR_COLORS.xterm



    5.22 서브 디렉토리까지 한번에 생성mkdir -p sub/sub1/sub2/ ....




    5.23 alias 적용안하기  #\rm file1
     쉘을 빠져나가기까지 alias를 적용 안하려면
     #unalias rm

    5.24 이동한 바로 직전의 디렉토리로#cd -




    5.25 일정기간 동안 접근하지 않는 파일 삭제하기$find /var/spool/mail -atime +5 -exec rm {} \;  
          <--- /var/spool/mail 아래 있는 디렉토리에서 5일동안 접근하지 않는 파일(-atime +5)은  
               삭제하라는 명령어

    혹은 3일 이전의 파일을 지우고자 한다면

    $find /tmp/log/ -mtime +7 -exec rm -rf {} \;  


    5.26 setuid가 설정된 루트쉘 검색  #find . -user root -perm 4755 -print  
       그렇게 되면 4755 퍼미션이 아니면 문제가 생길 것이다. 이런 경우에는 다음과 같이 명령을 내린다.  

     #ls -alR / |grep rws  
     #ls -alR / | grep r-s  
     #ls -alR / |grep -- --s  
       이렇게 하면 루트 쉘을 찾아낼 수 있다.  

    5.27 MySQL Connection Failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111) 에러가 나는 경우MySQL 데몬 프로세스가 돌아가지 않는 것이며 최신 버전은 ./safe_mysqld -u & 해서 실행해야한다.

    그럼에도 불구하고 sql 데몬이 실행이 안되고 /var/log/mysql.log에 다음과 같은 메시지가 표출될 경우가 있다.


    040720 15:57:28  /usr/libexec/mysqld: Table 'mysql.host' doesn't exist
    040720 15:57:28  mysqld ended

    이것은 DB를 설치하고 data base를 생성하지 않았기 때문이다. 다음의 커맨드로 DB를 생성시키도록 한다.

     $mysql_install_db

    mysql이라는 DB를 생성하고 그 안에 user와 host 정보를 가지게 된다. 그럼에도 에러가 나타난다면 퍼미션 문제일 가능성이 크다. /var/lib/mysql안의 내용을 mysql 소유자로 권한을 변경시켜서 데몬을 구동시켜 본다.

    $chown -R mysql.mysql /var/lib/mysql



    5.28 특정 유저만 su 허락하기. 휠 그룹에 등록

    vi /etc/group ------------   wheel:x:10:root,wantedid  

    2. su 권한 제한


    chgrp wheel /bin/su
    chmoe 4770 /bin/su


    5.29 작업중 로그인 막기시스템을 공사중일 때, root 이외의 다른 사용자를 로그인 못하게 해야 할 때가 있죠?
    그럴 때는, /etc/nologin 이라는 파일을 만들어,
    공사중 또는 Under Construction이라는 공지를 넣으면 됩니다.


    5.30 크기가 가장 큰 파일, 디렉토리 찾기가장 큰 디렉토리를 찾으려면,

    du -S | sort -n

    가장 큰 파일을 찾으려면,


    ls -lR | sort +4n


    5.31 현재 디렉토리의 크기만을 파악할때[root@dev2 local]# du -c -h --max-depth=0 *
    6.4M apache
    35M bin
    43M dns
    1.7M doc
    42k etc
    1.0k games
    42k geektalkd
    1.1M gnuws
    1.1M include
    41k info
    19M jakarta-tomcat-3.2.3
    0 jre
    15M jre118_v3
    25M lib
    62k libexec
    1011k man
    1.3M mm.mysql.jdbc-1.2c
    937k sbin
    3.8M share
    1.8M shoutcast-1-8-3-linux-glibc6
    5.2M ssl
    159M total


    5.32 시스템 정보 감추기/etc/inetd.conf 파일을 열어서,

    telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h


    5.33 메모리를 가장 많이 잡아먹는 프로세스 알아내기ps -aux | sort +4n

    또는

    ps -aux | sort +5n


    5.34 FTP로 들어온 사용자 확인하기ftpwho
    ftpcount


    5.35 원하지 않는 사용자 죽이기[root@dream /root]# skill -KILL sunny

    위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다.
    그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠?
    그럴때는

    [root@dream /root]# skill -KILL -v pts/14

    이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.


    5.36 몇일 이상된 파일만 mv또는 cp#find ./ -mtime +10 | awk ' { print "mv "$1" ./babo" } ' | sh

    find의 -mtime +10은 수정된지 10일 이상인 것만 찾는다. 이것을 이용해 나온 파일들을 ./babo 디렉토리 아래로 move


    5.37 터미널에서 백스페이스를 누르면 ^H 와 같은 이상한 문자가 출력되는 현상이 문제는 터미널에서 백스페이스를 어떠한 방식으로 인식하느냐의 문제에서 발생한다. 일반적으로 백스페이스는 ^?와 ^H로 나타내어지는데 터미널에서 ^H만을 백스페이스로 간주한다면, 이와 같은 문제가 발생하게 됩니다. 보통 그 자리에서 CTRL + h를 백스페이스 대용으로 써도 되고 export TERM="vt100" 로 터미널을 설정해도 되고 stty erase ^H 로 키보드 입력값을 조정해도 된다.


    5.38 텔넷이나 ftp 외부 사용시 root로 접속 가능하게 하는 방법레드헷계열은 공통이다.

    telnet
    /etc/securetty
    이파일은 root가 로그인가능한 터미널(tty)장치들을 나열해 둔 것이다.
    tty1
    tty2
    tty3
    tty4
    tty5
    tty6
    tty7
    tty8


    이 장치명은 가상터미널을 의미하는 것으로 root로 이런 가상터미널을 통한 접속이 허용된다는 것을뜻한다. 그리고
    ttyp0
    ttyp1
    ttyp2
    ttyp3


    등은 pseudo 터미널을 통해서 root의 접속이 가능함을 뜻하므로 원격지에서 root로 접속을 막으려면 다음설정과 같이 이 pseudo터미널을 모두 주석처리하면 된다. 그리고, 이 /etc/securetty파일에 다음과 같은 것을 볼 수도 있을 것입니다.
    ttyS0
    ttyS1
    ttyS2
    ttyS3


    등은 시리얼라인 또는 모뎀을 통한 root의 접속을 허용한다는 것을 뜻한다.


    FTP
    나의 경우 ProFtp 를 사용하고 있는데 proftp 의 경우 루트접속을 가능케 하려면 /etc/proftpd/ftpusers 파일을 여어서 root 를 주석처리해주면 된다.


    SSH
    나는 텔넷은 사용하지 않고 ssh 을 열어두고있다. 텔넷보다는 보안상 좀더 안정적이라고할수있겠다. ssh 의 경우 7.1 버전까지는 기본적으로 root 접속이 가능하다. 하지만 7.3버전에서는 접속이 안되니 ssh 에서 루트 접속이 가능하게하려면 ssh 설정파일인 /etc/ssh/sshd_config 파일을 열어서 PermitRootLogin 부분을 yes 로 해주시면 된다.


    PermitRootLogin yes


    5.39 여러 파일 안에 있는 내용중 특정단어를 바꾸고 싶을 때1. $ sed -e 's/aaaa/bbbb/g' < a.php > b.php
    하면 b.php 로 바뀐 파일이 나온다네요

    2. find 와 perl 의 조합으로 가능합니다.
    find / -name 'aaa.php' -type f -exec perl -pi -e 's/aaa/bbb/g' {} \;

    3. 하위 디렉토리까지 찾아서 파일 내의 특정한 내용을 바꾸는 명령입니다.
    find . -name *.html | awk '{ print "cat "$1" | sed \"s/바꾸고싶은말/바뀔말/g\" >"$1 }' | sh

    저는 이런식으로 하고 있습니다..
    find . -name *.html -exec perl -pi -e 's/바뀌고/바뀔/g' {}\;  위에서 찾을때 '*.html' 식으로 해야할 수도 있다.



    5.40 윈도우 디렉토리 마운트후 한글 디렉토리가 깨져보일 때윈도우 디렉토리를 그냥 마운트하면 한글로 된 파일이나 디렉토리가 ??로 나타나게 된다. 이때 다음과 같이 마운트를 하면 한글 디렉토리가 제대로 보인다.

    #mount -t vfat -o iocharset=cp949 /dev/hd* /mnt/win


    Feodra Core2 이상에서는 한글 인코딩 방식이 UTF8 방식을 쓰므로 iochoarset=utf8 이라고 해줘야 한글 폴더가 제대로 보인다.




    5.41 tail 명령어 활용# tail

    man tail 로 자세한 사용법을 알 수 있다. 가장 많이 사용하는 옵션으로는 -f 가 있는데 기본적으로 끝에서 10 줄까지를 보여준다. tail 은 계속 크기가 변하는 파일을 모니터링 할때 유용한 명령어인데 보안적으로나 기타 여러가지에 있어서 아주 유용한 명령어이다. 실제 본인이 보안 프로젝트를 하면서 tail 은 상당히 강조를 했다.

    tail -f /var/log/messages

    messages 파일은 누가 뭐라고 해도 가장 중요한 log 파일이다. 실제 항상 실행시켜놓고 있는 명령어이다. 또한 몇몇 중요한 log 파일들이 있는데 secure, xferlog 등등이 있는데 /etc/syslog.conf 파일에서 모든 log 를 한 파일로 남기게 해서 하나의 파일만 모니터링을 하고 있으면 좋을 것이다.
    일단 sendmail 이 시작되지 않을 경우를 예를 들어 보자. 창을 두개을 열고 하나의 창에서 tail -f /var/log/maillog를 실행한다. 그리고 다른 창에서 sendmail 을 재시작 시켜보자. 그러면 tail -f 를 실행한 곳에서 maillog 에 기록되는 상황이 계속 출력이 될것이다. 이것을 이용하면 에러 대처에 많은 도움이 될수 있을 것이다.

    tail 명령어에서 두번째로 많이 쓰는 옵션은 -n 일 것이다.
    -n 옵션은 원하는 수 라인 만큼 값을 출력하는 것이다. -c 는 bytes 만큼.

    tail 의 반대 명령어는 head 이다. head 명령어는 앞에서 부터 보여주는 명령어이다.



    5.42 shell prompt 변경하기일단 prompt 는 PS1 이라는 환경 변수를 이용한다. 즉 root 권한이 있다면 /etc/bashrc나 /etc/profile 에서 PS1 변수가 지정이 되어 있는것을 수정하여 전체 유저의 prompt 를 수정할수 있다. 만약 개인 유저가 prompt 를 수정하고 싶다면 계정 홈의 .bashrc 의 제일 마지막 라인에 PS1="" 을 설정해 주면 된다. PS1 에 사용되는 예약어에 대해서는 아래를 참고 하도록 하면 된다.

     \t     현재 시간을 HH:MM:SS 형식으로 표시
     \d     날자를 "요일 월 일" 형식으로 표시 (예,  "Tue May 26")
     \n     개행문자
     \s     쉘의  이름, $0 의 베이스 이름 (마지막 슬래쉬 뒷 부분)
     \w     현재 작업 디렉토리
     \W     현재 작업 디렉토리의 베이스 이름
     \u     현재 사용자의 사용자명
     \h     호스트 이름
     \#     이 명령의 명령 번호
     \!     이 명령의 히스토리 번호
     \$     유효 UID가 0 이면 if the effective UID is 0, a #, 그렇지 않으면 $
     \nnn   팔진수 nnn에 해당하는 문자
     \\     백슬래쉬
     \[     비출력  문자의 시퀀스를 시작한다. 프롬프트에 터미널 제어 시퀀스를 넣을 때 사용한다.
     \]     비출력 문자의 시퀀스를 마친다.


    5.43 kernel 파라미터 조정하기보통 커널의 파라미터를 조정할때 proc 에서 echo 를 이용하여 redirect로 직접 쓰는 경우가 많았다. 이렇게 조정을 할 경우에는 또 rc.local 같은 파일에 따로 기입을 해 줘야 하는 불편함이 있었다. RedHat 6.2 이후 배포판에는 sysctl 이라는 package가 추가되어 이것들을 관리를 할수 있게 되었다. 일단 조정할수 있는 모든 parameter 들은

    $ sysctl -a

    명령으로 확인을 할수가 있다. 그리고 특정값을 수정하기 위해서는 /etc/sysctl.conf 에 해당 키(이건 sysctl -a 명령에서 리스트를 확인할수 있다)와 키값을 지정한 다음

    $ sysctl -p

    명령으로 바로 적용을 시킬수 있다. 물론 sysctl.conf 에 기입이 되면 부팅시 마다 자동으로 적용이 된다.
    만약 잠시만 바꾸어 보고 싶다면

    $ sysctl -w net.ipv4.icmp_echo_ignore_all=0

    과 같이 직접 값을 넣어 줄수도 있다. 이럴 경우에는 부팅이 되어 있는 순간만 적용이 된다. -p 옵션은 sysctl.conf 가 아닌 다른 파일을 설정 파일로 지정을 할수 있게 한다. 옵션값이 없으면 default 로 /etc/sysctl.conf 를 읽어 들이며 따로 path 를 지정하면 해당 path 에있는 파일을 읽어 들인다.


    5.44 사용자별 du -h 값 보기du 4.0p 이상

    du -h --max-depth=1 /home/ | less  


    5.45 하룻동안 만들어진 파일 검색하기find / -ctime -1  


    5.46 apache 설정 파일 문법 오류 검색httpd.conf를 설정한 후에 쉘에서

    bash# httpd -t

    명령을 실행해 보도록 한다. 그러면 apache가 자체적으로 httpd.conf에서 에러가 있는지 없는지를 살펴 보게 된다.


    5.47 레드햇 패키지 버전을 알고 싶을 때#cat /etc/redhat-release


    5.48 새로운 배포본 설치를 위한 Multi LILO리눅스를 오래 사용하다 보면 나름대로 입맛에 맞게 튜닝이 되어 있을 것이다. 이때 새로운 배포본이나 호기심을 자극하는 작업때문에 리눅스를 새로이 설치할 경우가 많다. 이럴 경우 중요 세팅 파일이나 작업 데이타 파일등을 백업을 해놓고 새롭게 리눅스를 설치할 텐데 간혹 다시 이전 상태로 복귀해야할 상황에 부딪히곤 한다. 이때 원래 이전 셋팅으로 되돌리기 위해선 상당히 번거로운 작업을 해야하는데 이때 Multi LILO를 이용하면 편리하다.

    먼저 최초 리눅스 설치시 하드디스크가 하나라면 5GB 정도 나누어 비워 둔다. 혹은 여분의 하드 디스크가 있으면 더 좋다.
    이후 최신 배포본이나 호기심을 자극하는 새로운 배포본이 나왔을 경우 설치를 한다. 물론 비워둔 5GB나 여분의 하드디스크에 설치를 하는데 이때 중요한 것은 LILO를 설치할 때 해당 파티션의 부트섹터에 설치를 해야한다는 것이다.
    예를 들어 하드 디스크가 하나일 경우 다음과 같이 파티션 테이블이 구성되어 있다고 하자.


    /dev/hda
    /dev/hda1 : MS 시스템
    /dev/hda2 : Linux 시스템
    /dev/hda2 : /home ...
    /dev/hda3 : 확장 파티션
    /dev/hda4 : 비워둔 5GB 영역
    /dev/hda5 : swap 파티션
    /dev/hda6 : MS 영역

    이중 /dev/hda4에 새 배포본을 설치하며 LILO 또한 /dev/hda4에 설치를 한다. 그리고 설치하는 새 배포본의 swap 영역을 기존이 리눅스에서 사용하는 영역인 /dev/hda5를 사용하면 된다. 만약 여분의 하드디시크인 /dev/hdb에 설치를 한다면, LILO 또한 /dev/hdb에 설치하면 된다 . 이때도 swap영역을 /dev/hda5 로 사용해도 된다.
    설치가 끝나면, 현재 쓰고 있는 기존의 리눅스에서 LILO에 다음과 같은 항목을 추가한다.

    other=/dev/hda4                # or other=/dev/hdb1
           label=newLinux         # <Ctrl + D>를 눌러 종료

    그리고 /sbin/lilo 명령으로 반영시키도록 한다.
    부팅을 하면 새로운 이미지(메뉴)가 생기는 것을 볼 수 있다.
    부가적으로 LILO상에서 이전 LILO로 전환하고 싶으면 새로 설치한 배포본으로 로긴한 후 다음과 같이 재갱신 후 다시 재부팅하여 새롭게 설치한 LILO로 와서 native 이미지를 지정하면 다시 원래의 LILO로 로딩할 수 있다.

    other=/dev/hda
           label=native        # <Ctrl + D>를 눌러 종료


    5.49 Rebooting 키 제한을 위한 설정리눅스에서는 일반 유저 권한일지라도 콘솔에서 <Ctrl + Alt + Del> (이하 CAD)를 누르면 재부팅이 가능하다. 이를 무시하게 하려면 /etc/inittab을 다음과 같이 열어서,

    [root@choco root]#vi +/CTRL-ALT_DELETE /etc/inittab

    # Trap CTRL-ALT-DELETE
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now

    여기서 두 번째 열을 주석 처리한다.

    #ca::ctrlaltdel:/sbin/shutdown -t3 -r now

    이렇게 하면 어떤 유저도 CAD를 사용할 수 없게 된다.
    그러나 이렇게 하면 root도 CAD를 사용할 수 없기 때문에 선택적으로 CAD를 허용하게 하면 좋을 것이다.
    만약 root와 choco에게만 CAD를 사용할 수 있게 하려면 /etc/inittab의 CTRL-ALT-DELETE 항목을 다음과 같이 수정한다.

    ca::ctrlaltdel:/sbin/shutdown -a -t3 -r now

    그리고 CAD 신호 입력시 권한 비교 데이타 파일을 생성한다.

    [root@choco root]#cat > /etc/shutdown.allow
    root
    choco         # ctrl + D를 눌러 중료

    그리고 수퍼프로세스에게 /etc/inittab을 갱신시킨다.

    [root@choco root]#init q

    이후부터는 CAD 신호가 들어오면 init에 의해 shutdown은 실행되고 -a 옵션에 의해 먼저 /etc/shutdown.allow 파일이 있는지 확인을 하고 그 파일안에 있는 유저와 /var/run/utmp 파일을 바탕으로 가상 콘솔에 로그인한 유저를 비교한다. 그래서 일치하면 셧다운이 일어나고 그렇지 않으면 권한없음 메시지를 출력하게 된다.


    5.50 하드디스크 I/O 튜닝DMA 기능을 셋팅하는 것으로 하드 디스크의 액세스 속도를 확연하게 올릴 수 있다.
    먼저 메인보드의 칩셋이나 방식에 따라 커널 컴파일에 옵션을 추가해야 I/O 속도개선을 위해 커널 수준의 지원을 받을 수 있다.
    ATA/IDE/MFMRLL support -> IDE, ATA and ATAPI Block Devices 항목에서 다음의 네 옵션을 체크한다.

    [*] Generic PCI IDE Chipset supoort
    [*] Generic PCI bus-master DMA support
    [*] Use PCI DMA by default when available
    /* 이하 각자의 메인보드 칩셋에 맞게 설정 */
    [*] VIA82CXXX chipset support

    그리고 하드디스크의 정보출력/셋팅/성능측정등의 작업을 위한 유틸리티인 hdparm을 이용해서 I/O 셋팅을 한다. 플래그 옵션은 -c를 이용해서 I/O를 32비트로, -d 옵션을 써서 dma 기능을 활성화 시킨다.


    [root@choco root]#hdparm --help
    -c * get/set IDE 32-bit IO setting
    -d * get/set using_dma flag
        ....
    [root@choco root]#hdparm -c 1 /dev/hda
    [root@choco root]#hdparm -d 1 /dev/hda

    간혹 특정 스펙의 하드디스크가 DMA 기능을 제대로 지원하지 못할 경우 시스템이 잦은 크래쉬가 발생할 수 있다. 이렇게 불안한 증상을 보일 때는 다음과 같이 비활성화 시킨다.

    [root@choco root]#hdparm -c 0 /dev/hda
    [root@choco root]#hdparm -d 0 /dev/hda

    hdparm에서는 -t 옵션이 일반적인 하드디스크의 상태를 나타낸다. 이것보다 좀더 세부적인 벤치마킹을 가능케 하는 유틸이 liobento이다.

    [root@choco root]#liobento -d /dev/hda

    부팅시 자동으로 I/O 32비트, on_dma가 활성화시키려면 다음과 같이 한다.


    [root@choco root]#echo "hdparm -c 1 -d 1 1> /dev/null 2>&1" >> /etc/rc.d/rc.local

    최근에 출시되는 배포본에서는 기본적으로 DMA모드를 활성화시키지만 개인이 커널을 새롭게 업그레이드하거나 하드디스크의 성능을 제어하려면 알고 있어야 한다.



    5.51 Core 파일 디버깅Core파일은 어떤 프로그램이 갑자기 dump core로 종료될 때 만들어진다. Core는 하드디스크에 씌워진 메모리내의 프로그램 정보를 담고 있어 왜 프로그램이 죽었는지 조사할 수 있다.
    다음과 같이 -core 옵션으로 core가 발생한 프로르램의 path와 이유를 알 수 있다.

    $gdb -core core

    그리고 core를 야기시킨 함수를 조사하려면 다음과 같이 커맨드를 친다.

    $gdb path/to/program -core core


    5.52 CPU부하와 메모리 사용 정보일반적으로 프로세스와 시스템에 관한 수많은 정보들은 /proc 디렉토리에서 찾을 수 있다. top을 통해 볼 수 있는 평균부하량(load average)를 얻으려면 다음을 보며 된다.

    cat /proc/loadavg

    특정 프로세스에 의한 메모리 사용 정보는 /proc/stat에서 찾을 수 있다. 더 자세한 정보는 proc 메뉴얼을 확인하라

    man 5 proc


    5.53 Fedora Core2에서 한글 인코딩 바꾸기Feodra2를 깔고나면 기본적으로 인코딩이 utf-8로 설정되어 있다. 이 설정대로 쓰게되면 pstree나 ntsysv같은 쉘 기반의 화면들이 마구 깨져나온다. 한글 인코딩을 euck로 바꿔줘야 한다.
    # vi ~/.bashrc 에서 다음을 입력한다.

    export LC_ALL=ko_KR.eucKR  
    export LANG=ko_KR.eucKR  

    x윈도우의 터미널을 쓴다면 그놈터미널에서 euc_kr 로 설정하면 된다.


    5.54 Fedora2에서 한글man page 깨지는 현상에 대한 해결책#export LANG=ko_KR.eucKR              (i18n~~~ 파일에서 바꿔놓으면 더 좋다.)

    /etc/man.config에서

    : PAGER /usr/bin/less -is



    : PAGER /usr/bin/less -isr

    로 고친다.


    /etc/man.config 에서


    KNROFF LANG=ko_KR.eucKR /usr/bin/nroff -Tkorean -mandoc

    식으로 LANG 값을 앞에 넣어주면 깨지던 문제가 제대로 잘 나온다고 한다. man-1.5m2 에서는 위와같이 할 경우, 한글로 나오긴 하지만, man.config의 일부 내용이 출력되는 현상이 있다고..

    2006/09/08 14:09 2006/09/08 14:09
    이 글에는 트랙백을 보낼 수 없습니다
    Linux  2006/09/08 14:08
    출처 블로그 > nowdob님의 블로그
    원본 http://blog.naver.com/nowdob/80011052465

    Kernel Compile

    make menuconfig

    make dep clean bzImage modules modules_install

    How to set the $PATH variable in Redhat 9.0

    http://www.mediacollege.com/linux/red-hat/path-variable.html


    RPM

    [강제설치]

    rpm -Uvh --nodeps --force *rpm

    [삭제]

    rpm -e 지우고자하는 rpm파일명

    언어 설정 바꾸기 (Redhat 9.0)

    /etc/sysconfig/i18n파일 내용 변경

    [예제] // LANG 항목만 변경하면 됨

    -- 영어

       LANG="en_US.UTF-8"

       #SYSFONT="latarcyrheb-sun16"

       #SYSFONTACM="utf8"

    -- 한국어

       LANG="ko_KR.eucKR"

       #SYSFONT="lat0-sun16"

       #SYSFONTACM="8859-15"

    ip주소 추가하기 (Redhat 9.0)

    #ifconfig eth1 inet6 add 3ffe:ffff:0:f101::1/64    //원하는 IPv6 주소 설정

    vga=792 option사용하기 위한 커널 옵션 설정(2.4.26) - 나름대로 정리 확인 필요

    [Block devices]

      Loopback device support 체크

      RAM disk support 체크

    [Console drivers]

      VGA text console 체크

      Video mode selection supprot 체크

      [Frame-buffer support --->]

       Support for frame buffer devices 체크

       VESA VGA graphics console 체크

    Ethernet  설정

    #vi /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0

    BOOTPROTO=none

    ONBOOT=yes

    IPADDR=203.253.3.71

    NETMASK=255.255.255.0

    USERCTL=no

    PEERDNS=no

    GATEWAY=203.253.3.254

    TYPE=Ethernet

    NETWORK=203.253.3.0

    BROADCAST=203.253.3.255

    VI - TAB키 간격 설정

    [명령어 모드]

       :se ts=4

    [실행될 때마다 적용]

    사용자 홈디렉토리에 .exrc 파일 생성

    다음 내용 추가

    se ts=4

    vi 주석색깔 바꾸기

    사용자 홈디렉토리에 .exrc 파일 생성

    다음 내용 추가

    highlight Comment term=bold cterm=bold ctermfg=4

    [참고 - ctermfg]:

    1:주황? 2: 초록 3: 노랑 4: 연한 파랑 5: 보라 6: cyan  7: 하얀ㅣ

    vi 폴더색깔 바꾸기

    /etc/DIR_COLORS에서 DIR 01;34의 값을 변경

    /etc/DIR_COLORS.xterm은 Terminal에 적용되는 것으로 판단되었음

    모듈올리기 (ex. ftp)

    #chkconfig --list                          // 현재 설정 상태 확인

    #chkconfig --level 2345 vsftpd on    // 2,3,4,5로 부팅시에 자동으로 시작

    #/etc/rc.d/init.d/vsftpd restart       // 직접 데몬 지정해서 실행할 수도 있음

    [참고]

    #vi vsftpd                                   // 스크립트 파일을 살펴보면 환경설정파일 정보

                                                   // 등을 알수 있음

    #setup                                       // 부팅시에 올릴 데몬 설정

    grep 명령어 사용

    #grep -rn "bind error" *.c *.h          // 특정 구문 검색시 유용

    사용자 계정 추가 & 삭제

    #adduser 계정이름        // 추가

    #passwd 계정이름        // 비밀번호 변경

    #userdel 계정이름           // 삭제

    iptables (특정 mac address로부터 수신한 패킷 DROP)

    #iptables -A INPUT -m mac --mac-source [MAC Address] -j DROP    

    간단한 Router 설정법

    In Router

    #vi /proc/sys/net/ipv4/ip_forward

    //해당파일 내용 1 로 변경

    //route add 명령어로 라우터에 붙어있는 각각의 인터페이스에 대한 설정

    In Hosts

    //route add default gw 명령으로 각각의 호스트의 디폴트 게이트웨이 설정

    2006/09/08 14:08 2006/09/08 14:08
    이 글에는 트랙백을 보낼 수 없습니다
    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
    이 글에는 트랙백을 보낼 수 없습니다
    웅쓰:웅자의 상상플러스
    웅자의 상상플러스
    전체 (379)
    게임 (5)
    영화 (2)
    기타 (23)
    맛집 (5)
    영어 (2)
    대수학 (3)
    형태소 (5)
    Hacking (9)
    Linux (112)
    HTML (48)
    Application_developing (48)
    Web_developing (102)
    Window (11)
    «   2024/05   »
          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 31  
    1. 2016/01 (1)
    2. 2015/12 (3)
    3. 2015/10 (3)
    4. 2015/03 (2)
    5. 2015/01 (4)