2013년 11월 26일 화요일

리눅스 보안 설정

이 문서는 Kapil Sharma가 쓴 기본 적이면서, 꼭 확인해 두어야 할 리눅스 보안 팁 입니다. 원문은 http://www.linuxgazette.com/issue58/sharma.html에 있습니다.
  • BIOS 콘솔로의 접근을 막기 위해서는 BIOS 에 암호를 설정해두고, 플로피로의 부팅 은 하지 못하도록 설정합니다.
  • LILO 다음과 같은 설정으로 리로에 암호를 걸수 있습니다.
    1. lilo 설정 파일 (/etc/lilo.conf) lilo.conf boot=/dev/hda map=/boot/map install=/boot/boot.b time-out=00 # time-out을 0로 설정 prompt Default=linux restricted # 이 라인을 추가 password= # 이 라인을 추가하고 암호를 설정 image=/boot/vmlinuz-2.2.14-12 label=linux initrd=/boot/initrd-2.2.14-12.img root=/dev/hda6 read-only
    2. 리로 설정파일의 암호가 암호화되지 않은 일반 텍스트이므로, 루트만이 억세스 할수 있도록 다음과 같이 합니다. chmod 600 /etc/lilo.conf
    3. 리로 설정 파일을 수정 한다음 리로를 실행합니다. /sbin/lilo -v
    4. 마지막으로 리로 설정 파일의 변경을 막기위해 lilo.conf 파일 을 chattr 명령으로 Immunize(변경불가)로 만듭니다. (역주, ext2 파일 시스템 에서만 됩니다.) chattr +i /etc/lilo.conf

  • 불필요한 계정 삭제하기 시스템에서 사용하고 있지 않는 불필요한 계정은 삭제합니다. 예를 들어 lp, sync, shutdown, halt, news, uucp, operator, games, gopher 등..., 계정의 삭제는 다음과 같이 할수 있습니다. userdel gopher 그룹의 삭제는 groupdel gopher
  • 확실한 암호체계를 사용한다.
    1. 암호의 길이 대부분의 배포본에서 기본적으로 암호의 길이는 5자 이상으로 설정 되어 있습니다. 이것은 8자 이상으로 바꾸어야 합니다. 이것을 위해서는 login.defs 파일을 수정합니다. (보통 /etc/login.defs) PASS_MIN_LEN 5 을 PASS_MIN_LEN 8 로 바꾸어 줍니다.
    2. 쉐도우 패스워드 사용 이것은 일반적으로 리눅스 설치시 옵션입니다. 이후에는 authconfig 유틸리티를 사용할 수 있습니다. 기존 암호들과 그룹등의 쉐도우 패스워드로의 전환은 pwconv, grpconv 같은 명령을 사용할수 있습니다.

  • root 계정 루트 계정은 유닉스 시스템에서 가장 강력한 권한을 가지고 있는 계정입니다. 만약 관리자가 콘솔로의 접속후, 로그아웃하는 것을 잊고 루트 프롬프트를 그 대로 놔두었다면, 위험한 상황이 벌어지겠지요? 이런 상황을 피하기 위해 TMOUT 변수를 사용할수 있습니다. /etc/profile 파일 또는 루트의 해당 쉘의 설정파일, 예를 들어 bash 라면 ~/.bash_profile 에 다음과 같이 설정해 둡니다. HISTSIZE=0 HISTFILESIZE=0 TMOUT=3600 숫자는 초단위 입니다. 3600초 즉, 1시간동안 아무런 입력이 없다면 자동으로 로그아웃됩니다. HISTSIZE 와 HISTFILESIZE 를 0으로 해두는 것도 만약을 위 한 조치입니다.
  • console-equivalent 접근 일반 유저의 콘솔 관련 프로그램 사용을 방지합니다. 예를 들어 shutdown, reboot, halt와 같은 명령어들 입니다. 다음과 같이 합니다. rm -f /etc/security/console.apps/명령어
  • 사용하지 않는 서비스 지우기 사용하지 않고, 불필요한 서비스 패키지는 삭제합니다. 일단 /etc/inetd.conf 파일을 수정해서 사용하지 않는 서비스는 모두 주석처리(#)한후, inetd를 재시동합니 다.
    1. /etc/inetd.conf 파일을 600 모드로 바꾸어서 루트만이 억세스 하도록 합니다. chmod 600 /etc/inetd.conf
    2. 반듯이 /etc/inetd.conf 파일의 오너는 root 이여야 합니다. chown root.root /etc/inetd.conf
    3. inetd.conf 를 수정합니다. 예를 들어 ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth등 사용하지 않 는 서비스들은 모두 주석처리 합니다.
    4. inetd 를 재시동합니다. killall -HUP inetd
    5. /etc/inetd.conf 파일을 immunize 합니다. chattr +i /etc/inetd.conf 다시 변경이 가능하게 하려면 chattr -i /etc/inetd.conf 하면 됩니 다.

  • TCP_WRAPPER 사용하기 tcp wrapper로 서버로의 접근을 제한할수 있습니다. 가장 좋은 정책은 일단 /etc/hosts.deny 에 ALL: ALL@ALL, PARANOID 로 모든 접근을 막은 후, /etc/hosts.allow 에 허가 해주는 것입니다.
    1. hosts.deny 파일을 다음과 같이 수정합니다. ALL: ALL@ALL, PARANOID
    2. hosts.allow 를 다음 예와 같이 수정합니다. ftp: 202.54.15.99 foo.com 위 설정은 ftp 억세스를 ip 주소인 202.54.15.99와 foo.com 도메인 을 가지는 클라이언트 들에게 허용합니다.
    3. 마지막으로 tcpdchk 명령으로 설정파일들의 오류를 확인해 볼 수 있습니다.

  • 시스템 정보를 보여주지 말자 외부에 서버의 정보를 최대한 보여주지 않는 것도 공격을 예방하는 방법입니 다. 예를 들어 "/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 옵션은 시스템 정보를 보여주지 않고, 사용자에게 id 와 암호만 물어옵니 다. 그러나 언제나 telnet 보다는 sshd 의 사용을 권장합니다.
  • "/etc/host.conf" 파일 수정 # Lookup names via DNS first then fall back to /etc/hosts. order bind,hosts # We have machines with multiple IP addresses. multi on # Check for IP address spoofing. nospoof on 첫번째 줄은 DNS 관련 설정입니다. 먼저 DNS 에서 host name을 resolve 하고, 다음 hosts 파일을 참조하라는 것입니다. multi 옵션은 /etc/hosts 파일에 다 중 IP 주소를 가질수 있다는 것이며, 마지막 nospoof 옵션은 서버로의 스푸핑 을 방지합니다.
  • "/etc/services" 파일은 immunize 합니다. chattr +i /etc/services
  • 루트 로그인의 제한 /etc/securetty 파일은 어떤 TTY 디바이스로 루트 로그인이 가능한지 설정합니 다. 불필요한 디바이스는 주석처리 합니다.
  • 일반 유저의 su root 방지 특정 유저만 su root 할수 있도록 설정하려면 다음과 같이합니다. /etc/pam.d/su 파일의 처음에 다음을 추가합니다. auth sufficient /lib/security/pam_rootok.so debug auth required /lib/security/Pam_wheel.so group=wheel /etc/group 의 wheel 그룹에 su root를 허용하고자 하는 사용자 그룹 등록합니 다. wheel:x:10:root,someone
  • 쉘 로그 파일 bash 쉘은 500여개의 지난 명령어를 ~/.bash_history 에 남깁니다. 다음과 같 이 크기를 줄이거나, 0로 설정해 아예 로그를 남기지 않도록 합니다. ~/.bash_profile 에 HISTFILESIZE=30 HISTSIZE=30
  • Control-Alt-Delete 키를 사용하지 못하도록 합니다. /etc/inittab 파일에서 다음과 같은 라인을 찾아 주석처리 합니다. #ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  • "/etc/rc.d/init.d" 디렉토리와 파일들의 퍼미션 수정 chmod -R 700 /etc/rc.d/init.d/* 위와 같이 설정해서 루트만이 억세스 할수 있도록 합니다.
  • 시스템 정보 숨기기 기본적으로 리눅스 서버로 로그인 할때 배포본, 버젼, 커널 버젼, 서버이름 등 이 나타나도록 되어 있습니다. 이것은 서버를 노리는 크랙커들에게 더 많은 정 보를 줄뿐입니다.
    1. "/etc/rc.d/rc.local" 의 수정 rc.local 매 부팅시마다 /etc/issue 파일을 생성하는 루틴이 있습니 다. 이 부분을 모두 주석처리 합니다. # This will overwrite /etc/issue at every boot. So, make any changes you # want to make to /etc/issue here or you will lose them when you reboot. #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
    2. 이슈 파일 삭제 rm -f /etc/issue rm -f /etc/issue.net
  • SUID/SGID 프로그램 찾기 일반 유저가 루트 권한으로 실행 시킬수 있는 불필요한 SUID/SGID 프로그램들 은 최소화 합니다. 먼저, 다음과 같이 SUID/SGID 퍼미션의 파일들을 찾아내서 find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls ­lg {} \; 모드를 바꾸어 줍니다. chmod a-s [program]
수정/보안할것은 연락주시기 바랍니다.


* 이하 역자 추가 *
  • 포트 스캐너
일반적으로 크래커들이 제일 먼저 해보는 것은 공격할 서버에 어떤 서비스 포 트들이 열려 있는지 포트 스캐닝을 해본후, 열려있는 서비스들 중에 알려진 버 그를 이용하는 경우가 많습니다. 이런 포트 스캐닝을 감지 할수 있는 툴이 몇 가지 있는데 그중에서 가장 간단한 scanlogd 라는 툴을 소개합니다. scanlogd 는 http://www.openwall.com/scanlogd /에서 최신 버젼을 받을수 있습니다.
  1. 먼저 타볼 소스를 풀어 make linux 로 간단하게 컴파일을 하 면 scanlogd 라는 바이너리가 생깁니다. 적당한 곳에 옭겨둡니다. (예 /usr/local/sbin/)
  2. scanlogd 라는 유저를 만듭니다. 로그인 할 필요가 없는 계정 이므로, /etc/passwd 파일을 수정하든지 해서, scanlogd:x:521:521::/home/scanlogd:/bin/false 와 같이 /bin/false 로 해놓 습니다.
  3. 로그를 남기기 위해 /etc/syslog.conf 에 다음을 추가합니 다. daemon.alert /var/log/alert
  4. 이제 scanlogd 를 실행시켜 놓으면 어느 ip 에서 포트 스캐닝 을 하는지 /var/log/alert 에 다음과 같이 남게 됩니다. 재 부팅시에 실행되도 록 /etc/rc.d/rc.local 같은곳에 넣어둡니다. Jan 23 22:34:05 test scanlogd: xxx.xxx.xxx.xxx to yyy.yyy.yyy.yyy ports 1, 7, 9, 11, 13, 15, ..., fSrpauxy, TOS 00, TTL 120 @22:34:05 xxx.xxx.xxx.xxx 라는 ip 가 yyy.yyy.yyy.yyy 의 포트를 스캔하였습 니다.
  5. 보통 포트 스캐닝만 했다고 어떤 조치를 취해야 하는 것은 아 닙니다. 하지만 그후에 어떤 이상이 있다고 생각되면 그 ip 의 서버로의 억 세스를 막을수 있겠지요. 커널에서 ipchains 을 지원한다면 간단하게 ipchains -A input -l -j REJECT -s xxx.xxx.xxx.xxx -d 0/0 -p all 와 같이 해버릴수 있겠지요.
  • 로그 확인 유틸리티
서버 관리자의 가장 기본적인 임무중 하나는 자신의 서버에 항상 기록되는 로 그들을 살펴보는 것입니다. 습관적으로 로그를 살펴보는 관리자의 서버는 그 만큼 크 래킹에서 벗어날수 있습니다. logcheck 라는 로그 관련 유틸리티가 있습니다. 여기서 받을수 있으며, http://www.psionic.com/download 이곳에는 또한 PortSentry 라는 포트 스캐닝 감지 유틸리티가 있는데, 이것 은 scanlogd 보다 더 적극적인 방어책으로, 설정에 따라 스캐닝을 감지했을때 자동으로 그 ip의 접근을 막는등의 일을 할수 있습니다. 사용하고 안하고는 취향 차이겠지요.

댓글 없음:

댓글 쓰기