Fogeaters, Light The World.

11

2016-Jan

리눅스 보안 기초

작성자: title: MoonBlonix IP ADRESS: *.148.87.98 조회 수: 1702



꼭 갖추어야 하는 리눅스 보안 기초

번역: 윤봉환 / el@linuxlab.co.kr

 

 

    이 기사에서 나는 리눅스 박스를 안전하게 만드는 기초를 설명하려 한다. 레드햇 리눅스 박스 보안을 염려하는 모든 이들에게 유용할 것이다.

 

BIOS 보안

    플로피디스크로 부트하거나 BIOS 설정 값을 바꾸지 못하도록 BIOS에는 항상 패스워드를 설정해 두어야 한다. 이렇게 해 두면 여러분의 몰래 특별한 목적으로 만들어진 부트 디스크를 이용해 리눅스 시스템을 부트하려는 이들을 막고, 플로피 디스크 드라이브로 부트하거나 패스워드를 묻는 프롬프트 없이 서버를 부트하려는 이들로부터 시스템을 보호할 수 있다.

 

LILO 보안

    "/etc/lilo.conf" 파일에 time-out, restricted, password 등 패러미터 세 개를 추가한다. 이 옵션들을 설정하면 부트할 때에 특별한 옵션들을(예를 들어 "linux single" 등) 넣어 패스워드 없이 루트로 로긴하려 할 때에도 패스워드를 묻는다.

    Step 1 
    lilo.conf 파일을 열어 (vi /etc/lilo.conf) 아래처럼 옵션 셋을 추가하고 설정 값을 바꾼다:

    boot=/dev/hda 
    map=/boot/map 
    install=/boot/boot.b 
    time-out=00 # 이 옵션은 값을 00으로 바꾼다.
    prompt 
    Default=linux 
    restricted # 이 줄을 추가한다
    password=<password> # 이 줄을 추가하고 패스 워드를 넣는다.
    image=/boot/vmlinuz-2.2.14-12 
    label=linux 
    initrd=/boot/initrd-2.2.14-12.img 
    root=/dev/hda6 
    read-only

    Step 2 
    우리는 앞서 "/etc/lilo.conf" 파일 속에 암호화되지 않은 패스워드를 넣었으므로 이 파일을 root만 읽을수 있도록 만들어야 한다.

    [root@kapil /]# chmod 600 /etc/lilo.conf

    root를 제외한 다른 이들은 이제 "/etc/lilo.conf" 파일을 읽지 못할 것이다.

    Step 3 
    아래 명령으로 "/etc/lilo.conf" 파일 안에 변경된 설정 값을 시스템에 반영한다:

    [Root@kapil /]# /sbin/lilo -v

    Step 4 
    chattr 명령을 사용해서 "/etc/lilo.conf" 파일을 수정할 수 없도록 설정하면 더 안전하다.

    * 파일을 바꿀 수 없게 만들려면(immutable) 다음 명령을 사용한다:
    [root@kapil /]# chattr +i /etc/lilo.conf

    이렇게 설정해 두면 어떻게 해도 "lilo.conf" 파일을 바꿀 수 없을 것이다.(우연히 혹은 그 밖의 다른 이유로)

    lilo 보안에 대해 더 많은 정보가 필요하면 http://www.linux4biz.net/articles.htm을 읽어본다.

 

특수한 계정을 모두 막는다

    리눅스를 설치하면 자동으로 생성되는 계정 가운데 lp, sync, shutdown, halt, news, uucp, operator, games, gopher 등 여러분이 실제로 사용하지 않는 계정은 모두 없애는 것이 좋다.

    사용자 계정을 없앨 때에는:
    [root@kapil /]# userdel LP

    그룹을 없앨 때에는:
    [root@kapil /]# groupdel LP

 

좋은 패스워드를 고른다

    좋은 패스워드를 고르기 전에 아래 규칙에 따라 패스워드 최소 길이를 설정한다.

    패스워드 길이:
    리눅스를 기본 값들로 설치하면, 최소 다섯 글자만 넣으면 패스워드로 받아들이도록 설정되어 있을 것이다. 하지만, 다섯 글자는 너무 적어 안전하지 못하고 최소한 여덟 글자는 되어야만 한다. 패스워드 길이 하한을 바꾸려면 login.defs 파일을 열어(vi /etc/ligin.defs) 아래와 같이 편집한다:

    PASS_MIN_LEN 5

    숫자 5들 아래처럼 8로 바꾼다:
    PASS_MIN_LEN 8

    "login.defs" 파일은 로긴 프로그램의 환경 설정 값을 넣어두는 파일이다.

 

섀도우 패스워드를 활성화한다

    섀도우 패스워드도 설정해야 한다. 
    "/usr/sbin/authconfig" 유틸리티를 이용하면 시스템에서 섀도우 패스워드를 활성화할 수 있다. 사용 중인 패스워드와 그룹을 섀도우 패스워드, 그룹으로 바꾸려면 pwconv와 grpconv 명령을 사용한다.

 

root 계정

    "root" 계정은 유닉스 계열 시스템에서 매우 강력한 권한을 가진 계정이다. root로 로긴한 시스템 관리자가 로그아웃하는 것을 깜빡 잊고 root 프롬프트를 남겨둔 채 떠나버렸다면, 타임아웃을 설정해 두고 일정한 시간이 지나서 자동으로 로그아웃하도록 설정할 수 있다. "TMOUT" 변수에 초단위로 타임아웃 시간을 설정하면 된다.

    "vi /etc/profile" 명령으로 프로파일을 열어서 아래 설정을 적당한 곳에 덧붙인다.

    "HISTFILESIZE=" 
    TMOUT=3600

    "TMOUT=" 변수에 설정한 값은 1 시간을 뜻한다. (60 * 60 = 3600 초) 이 줄을 "/etc/profile"에 넣어 두면 사용자가 접속해서 한 시간이 지나도록 아무 것도 하지 않을 때 자동으로 로그아웃한다. 사용자 홈 디렉토리 아래 ".bashrc " 파일에 넣어두고 개인적으로 사용할 수도 있다. 
    여러분 시스템에서 이 패러미터를 설정한 뒤에는 반드시 로그아웃 한 다음 다시 로긴해서 바뀐 설정 내용을 시스템에 적용해야 한다.

 

일반 사용자에 대해 모든 콘솔 접속을 제한한다

    shutdown, reboot, halt 등 프로그램은 일반사용자가 콘솔을 통해 접근할 수 없도록 만들어야 한다.

    그렇게 하려면, 다음 명령을 실행한다:

    [root@kapil /]# rm -f 
                        /etc/security/console.apps/<servicename>

    <servicename>에는 콘솔-을 통해 접근할 수 없도록 설정할 프로그램을 써 넣는다.

 

사용하지 않는 모든 프로그램을 제한하거나 지워버린다

    여러분 서버에서 사용하지 않는 서비스는 제한하고 제거한다. "/etc/inetd.conf" 파일을 열어서 여러분에게 필요 없는 서비스가 등록된 줄 맨 앞에 # 문자를 넣어 접속을 막는다. 그리고 inetd 프로세스에 SIGHUP 시그널을 보내서 "inetd.conf"파일을 새로 읽어들이게 한다. 다음과 같은 절차를 따른다:

    Step 1 
    먼저 "/etc/inetd.conf" 파일을 루트만 읽거나 쓸 수 있도록 설정한다. 아래 명령으로 퍼미션을 600으로 설정하면 된다:

    [Root@kapil /]# chmod 600 /etc/inetd.conf

    Step 2 
    "/etd/inetd.conf" 파일 소유자가 root인지 확인한다.

    Step 3 
    inetd.conf 파일을 열어 (vi /etc/inetd.conf) 아래 서비스들을 막아버린다:

    ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth
    그 밖에 여러분이 사용하지 않을 서비스들. 이렇게 해 두면 이런 서비스를 이용한 공격에 대해서는 거의 안전해진다.

    Step 4 
    inetd 프로세스에 HUP 시그널을 보낸다.

    [root@kapil /]# killall -HUP inetd

    Step 5 
    chattr 명령으로 아무도 "/etc/inetd.conf" 파일을 고치지 못하게 만든다.

    [root@kapil /]# chattr +i /etc/inetd.conf

    이제부터는 "inetd.conf" 파일이 바뀌지 않도록(고의든 아니든) 보호될 것이다. 슈퍼유저인 root만 이 속성을 설정하거나 제거할 수 있다. inetd.conf 파일을 고쳐야 할 일이 생긴다면 다음 명령으로 불변(immutable) 플래그를 제거한다:

    * 불변 속성을 제거하려면 다음 명령을 실행한다:

    [root@kapil /]# chattr -i /etc/inetd.conf

 

TCP_WRAPPERS

    TCP_WRAPPERS를 이용하면 허용하지 않는 외부 주소로부터 들어오는 침입을 막아 보안을 강화시켜 준다. 가장 좋은 정책은 "/etc/hosts.deny" 파일을 열어 "ALL: ALL@ALL, PARANOID" 줄을 추가해서 모든 호스트를 기본적으로 거부(deny)한 다음, "/etc/hosts.allow" 파일을 열어 신뢰할 수 있는 호스트만 열어주는 것이다. TCP_WRAPPERS는 아래 두 파일로 제어되는데 일단 일치하는 규칙을 찾으면 다른 규칙들은 비교하지 않는다.(규칙을 찾는 순서는 아래 순서대로이다)

    /etc/hosts.allow 
    /etc/hosts.deny

    Step 1 
    hosts.deny 파일을 열어 (vi /etc/hosts.deny) 다음 줄들을 추가한다:

    # 모든 접속을 거부
    ALL: ALL@ALL, PARANOID

    Which means all services, all locations is blocked, unless they are permitted access by entries in the allow file. 
    위 설정은 모든 서비스, 모든 사용자, 모든 출발지 주소를 막는다. allow 파일에서 허용할 주소로 설정된 목록까지 포함해서.

    Step 2 
    hotsts.allow 파일을 열어 (vi /etc/hosts.allow) 다음 예문처럼 여러분에 필요한 값들을 추가한다:

    예를 들어:
    ftp: 202.54.15.99 foo.com
    여러분 서버를 이용할 클라이언트 머신이: IP 주소가 202.54.15.99이고, 호스트 이름이 foo.com이라면 ftp 접속을 허용한다.

    Step 3 
    tcpdchk 프로그램은 tcpd 래퍼 환경설정을 점검한다. tcpdchk는 여러분 시스템에 설정된 tcp 래퍼 환경설정을 검사하고 잠재되었거나 실제로 드러나는 문제점들을 찾아내 보고 한다.

    * tcpd 래퍼를 설정한 다음에 tcpdchk 프로그램을 실행한다.
    [Root@kapil /]# tcpdchk

 

시스템 issue 파일을 외부에 노출시키지 말라

    외부에서 여러분의 서버에 로그할 때 시스템 issue 파일이 노출되지 않도록 설정해야 한다. 이렇게 하려면 "/etc/inetd.conf" 파일을 편집해서 telnet 옵션을 바꾼다.
    아래는 "/etc/inetd.conf" 파일을 열어 telnet 라인을 편집한 모습이다:

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

    위 줄을 다음처럼:

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

    줄 끝에 덧붙인 "-h" 플래그는 (hush) 텔넷 데몬이 시스템 정보를 보여주지 않도록 설정하므로 사용자는 login: 프롬프트만 만나게 될 것이다. 그러나 이 것만으로는 안전하지 않다. 오고 가는 데이터를 암호화하는 sshd를 사용하라고 권하고 싶다.

 

"/etc/host.conf" 파일을 바꾼다.

    "/etc/host.conf" 파일은 이름을 해석하는 방법을 지정한다. host.conf 파일을 열어 (vi /etc/host.conf) 다음 줄들을 추가한다:

    # 먼저 DNS를 통해 이름을 검색하고 다음에 /etc/hosts로 돌아간다.
    order bind,hosts 
    # 다중 IP 주소를 가진 머신이 있다.
    multi on 
    # IP 주소를 속이는지 (spoofing) 검사한다.
    nospoof on

    첫 번째 옵션은 호스트 이름을 해석할 때 DNS를 먼저 찾아보고 hosts 파일을 이용하도록 설정한다. multi 옵션은 "/etc/hosts" 파일에서 한 머신에 IP 주소 여러 개를 설정할 수 있도록 허용한다. (eth0, eth1, ... ethN 등 인터페이스가 여러개)
    nospoof 옵션은 IP를 속이지 못하도록 보호한다.

 

"/etc/services" 파일을 감염되지 않도록 보호한다.

    "/etc/service" 파일은 함부로 지워지거나 서비스를 추가하지 못하도록 반드시 보호해야 한다.

    * "/etc/services" 파일을 보호하려면 다음 명령을 사용한다:
    [root@kapil /]# chattr +i /etc/services

 

다른 장치에서는 root로 로긴하지 못하게 만든다

    "/etc/securetty" 파일은 "root" 사용자로 로긴 할 수 있는 TTY 장치를 지정한다. "/etc/securetty" 파일을 열어서 필요 없는 tty는 모두 주석으로 바꾼다. (# 문자를 줄 처음에 끼워 넣는다)

 

다른 사용자가 su 명령으로 root가 되는 것을 막는다

    su (substitute user) 명령은 한 사용자가 같은 시스템 안에 있는 다른 사용자가 될 때 사용하는 도구이다. 여러분이 허용한 사용자가 아니라면 su 명령을 사용할 수 없도록 설정하려면 "/etc/pam.d/" 디렉토리 아래 "su" 설정 파일을 열어 맨 꼭대기에 다음 두 줄을 덧붙인다.

    Step 1 
    su 파일을 열어 (vi /etc/pam.d/su) 다음 두 줄을 맨 꼭대기에 추가한다:
    auth sufficient /lib/security/pam_rootok.so debug 
    auth required /lib/security/Pam_wheel.so group=wheel

    이 설정은 "wheel" 그룹의 사용자만 su 명령으로 root가 될 수 있도록 허용한다; 그리고 누군가가 root로 su 했다면 기록을 남긴다. 이제부터는 su 명령으로 root가 되는 것을 허용할 사용자를 wheel 그룹에 추가하기면 된다.

 

셸을 사용한 기록

    bash 셸은 자주 사용하는 명령이나 긴 명령들을 나중에 또 써먹을 수 있도록 "~/.bash_history" 파일에 유저가 사용한 명령을 500 개 저장한다.( "~/"은 여러분의 홈 디렉토리를 나타낸다, 혹은 1000 이 기본 값일 수도 있다) 그래서, 시스템에 계정을 가지고 있는 사용자마다 홈 디렉토리에 "bash_history"라는 이름을 가진 파일이 생기게 된다. 시스템 자원을 아끼고, 사용기록을 노출하지 않기 위해 bash 셸이 명령을 조금만 저장하고, 로그아웃할 때에는 이 것을 지우도록 만든다.

    Step 1 
    "/etc/profile" 파일에서 HISTFILESIZE와 HISTSIZE 값이 여러분 시스템에 계정을 가진 모든 사용자에게 적용할 "Bash_history" 파일 크기를 지정한다. "/etc/profile"에서 HISTFILESIZE나 HISTSIZE 값을 30이나 그보다 작게 설정하는게 좋겠다.

    profile 파일을 열어 (vi /etc/profile) 아래처럼 바꾼다:

    HISTFILESIZE=30 
    HISTSIZE=30

    이 설정은 각 사용자마다 홈 디렉토리에 있는 "Bash_history" 파일에 지나간 명령을 조금만 저장할 수 있도록 설정한다.

    Step 2 
    "rm -f $HOME/Bash_history" line, so that each time a user logs out, its "Bash_history" file will be deleted.
    "/etc/skel/Bash_logout" 파일에 "rm -f $HOME /Bash_history" 라인을 추가해서 사용자가 로그아웃할 때마다 "Bash_histry" 파일을 지우도록 설정한다.
    Bash_logout 파일을 열어 (vi /etc/skel/Bash_logout) 파일을 열어 다음 줄을 추가한다:

    rm -f $HOME/Bash_history

 

Control-Alt-Delete 키를 눌러도 셧다운 되지 않게 만든다

    여러분 시스템에서 "/etc/inittab" 파일을 열어 (vi /etc/inittab) 관련된 줄을 주석으로 처리한다 ("#" 문자를 이용). 먼저 다음 줄을 찾는다:

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

    위 줄을 아래처럼 바꾼다:

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

    바뀐 설정을 시스템에 적용하려면 프롬프트에서 다음 명령을 실행한다:

    [root@kapil /]# /sbin/init q

 

"/etc/rc.d/init.d" 디렉토리 아래 스크립트 파일들에 설정된 퍼미션을
바로잡는다.

    "/etc/rc.d/init.d" 디렉토리 아래에는 시스템이 부트할 때 띄워야 하는 모든 프로세스를 실행하거나 멈추는 역할을 하는 스크립트들이 들어 있다. 아래 명령을 실행해서 퍼미션을 조정한다:

    [root@kapil/]# chmod -R 700 /etc/rc.d/init.d/*

    이 디렉토리에 있는 모든 파일은 root 사용자만 읽고, 쓰고, 스크립트를 실행할 수 있도록 허용한다는 뜻이다.

 

시스템 정보를 감추자

    여러분이 리눅스 박스에 로긴할 때 리눅스 배포판 이름, 버전, 커널 버전, 서버 이름 등 시스템 정보가 기본적으로 표시된다. 이런 정보들은 크래커에게 필요한 정보를 제공하기에 충분한 것으로 이 설정을 바꾸어 "Login:"프롬프트만 나타나도록 설정해야 한다.

    Step 1 
    그렇게 하려면, "/etc/rc.d/rc.local" 파일을 열어서 아래 줄을 찾아간 다음 맨 앞에 "#" 문자를 넣는다:

    # 이 곳에는 부트할 때마다 /etc/issue 파일을 덮어쓰도록 설정되어 있다.
    # 그래서, /etc/issue 파일을 바꾸어도 다음 번 부트 때에는 그 내용이
    # 사라질 것이다.
    #echo "" > /etc/issue 
    #echo "$R" >> /etc/issue 
    #echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue 

    #cp -f /etc/issue /etc/issue.net 
    #echo >> /etc/issue

    Step 2 
    그 다음, "/etc" 디렉토리 아래 "issue.net", "issue" 파일을 지운다:

    [root@kapil /]# rm -f /etc/issue 
    [root@kapil /]# rm -f /etc/issue.net

 

사용하지 않는 SUID/SGID 프로그램을 막아둔다.

    root가 소유한 프로그램에 SUID 가 설정되어 있고 이 것을 일반사용자가 실행할 수 있다면 루트 권한을 얻는데 이용할 수 있다. 그래서, 시스템 관리자는 SUID/GUID가 설정된 프로그램은 최소한으로 유지하고 필요 없이 SUID가 설정된 것들은 막아두어야 한다.

    Step 1 
    아래 명령으로 's' 비트가 설정된 root 소유 프로그램들을 찾는다:

    [root@kapil]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls ­lg {} \;

    * 아래 명령으로 위에서 찾아낸 프로그램들에서 suid 비트를 벗겨낸다:

    [root@kapil /]# chmod a-s [program]

    위에서 제안하는 보안 권고를 모두 설정했다면 시스템 관리자가 마땅히 해야 할 기본적인 수준의 시스템 보안을 갖추게 된 것이다. 어떤 작업들은 한 번 설정한 것으로 다시 손대지 않을지 모르지만 몇 가지는 계속해서 관심을 가지고 관리해야 할 것이다. 아무튼, 시스템 관리자의 최고 덕목은 부지런함이다.

    Written by: Kapil Sharma 
    Email: kapil@linux4biz.net 
    Website: http://www.linux4biz.net

    [Kapil Sharma는 리눅스와 인터넷 보안 컨설턴트이다. 2년 넘게 다양한 리눅스/유닉스 시스템에서 인터넷 보안 작업을 해왔다. 무료로 리눅스와 유닉스 솔루션을 제공하는 http://www.linux4biz.net 웹 사이트를 관리한다]

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

    Copyright ⓒ 2000, Kapil Sharma
    Published in Issue 58 of Linux Gazette, October 2000

    translation: el@linuxlab.co.kr

profile
profile

title: MoonBlonix

2016.01.11 08:46
*.148.87.98

역으로 생각하면 위의 항목들은 해킹시 시도해볼만한 서버의 취약점, 침입로가 될 수 있다는 거다

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 [Web] 클라우드 IDE + 2 title: MoonBlonix 2017-06-25 15124
12 AVR 타이머/카운터 인터럽트 레지스터 file + 2 title: MoonBlonix 2016-01-12 2047
11 [아두이노] L293D 모터드라이버를 이용한 DC모터 제어 file + 1 title: MoonBlonix 2016-01-11 1931
» 리눅스 보안 기초 + 1 title: MoonBlonix 2016-01-11 1702
9 라즈베리파이 각종 강좌(외부링크) title: MoonBlonix 2016-01-10 1687
8 라즈베리파이 기초작업 (절전모드, 시간, 한글, 계정변경, 관리자권한 등) title: MoonBlonix 2016-01-10 1909
7 한번에 끝내는 Ubuntu 웹서버세팅 + 1 title: MoonBlonix 2016-01-09 1904
6 AVR 128 기동하기 title: MoonBlonix 2016-01-09 2040
5 라즈베리파이 무선랜 설정 (고정IP) file title: MoonBlonix 2016-01-09 1852
4 라즈베리파이 무선랜 설정 (유동IP) title: MoonBlonix 2016-01-09 1664
3 네임서버, DDOS 공격차단, 트래픽 감소 -> CloudFlare title: MoonBlonix 2016-01-08 1994
2 도메인 네임 서버와 DNS - Domain Name System에 대해 title: MoonBlonix 2016-01-08 1640
1 cURL 이용한 웹프로그래밍 title: MoonBlonix 2015-12-13 1814