리눅스서버

리눅스의 기본 보안설정

리눅스를 새로설치하게되면 대부분 기본값으로 보안설정이 되어있지않습니다. 즉, 기본값으로 운영하게 되면 서버보안이 상당히 취약해 집니다. 아마도 보안은 생각하지않고, 편의를 위한 기본값인 것 같습니다.


아래는 리눅스로 서버운영시 꼭 해야 될 보안설정입니다. 안해도 서버운영엔 지장이 없지만, 보안엔 문제가 있겠죠..



1. SSH로 root 계정 직접 로그인 차단

SSH는 다른사람들도 로그인을 시도 할 수 있음을 명심해주세요. 아이디와 패스워드를 알게되면 누구나 시스템에 접근이 가능합니다. 더군다나 root 계정의 아이디는 모두 동일하게 "root"로 정해져있습니다.


따라서 SSH상에서 root 계정에 직접 로그인하는 것을 막아야합니다. 대신 일반계정에 접속한다음 su 명령으로 root 계정으로 전환하면 됩니다.


먼저 로그인을 할 수 있는 일반계정을 생성합니다. (여기서는 conory라는 계정을 생성하겠습니다.)


# useradd conory

# passwd conory


/etc/ssh/sshd_config 파일에서 PermitRootLogin 설정을 no 로 변경합니다.


# vi /etc/ssh/sshd_config


PermitRootLogin no


그리고 sshd 서비스를 재시작하면 됩니다.


# service sshd restart



2. 특정 계정만 su 명령을 사용할 수 있게 하기

1번 사항을 적용하였다면 su 명령으로만 root 권한을 획득할 수 있을 것입니다. 이 중요한 su명령을 아무나 사용하게 두어서는 안되겠죠.. 특정 사용자 계정에서만 su 명령을 사용할 수 있도록 해봅시다.


/bin/su 명령파일을 wheel 그룹 소유로 돌리면 wheel 그룹에 속한 계정만 su 명령을 사용할 수 있습니다. 저는 conory 계정에서만 su 명령을 사용할 수 있도록 해보겠습니다.


먼저 wheel 그룹에 conory 계정을 추가합니다.


# vi /etc/group


wheel:x:10:root,conory


그리고 /bin/su 파일의 소유그룹을 변경합니다.


# chown root.wheel /bin/su


마지막으로 su 파일을 변경할 수 없도록 속성을 변경합니다.


# chmod 4750 /bin/su

# chattr +i /bin/su



3. FTP 사용안함

일반 FTP는 보안에 취약하므로 사용을 하지않는 것이 좋습니다. 대신 보안에 좋은 SFTP를 사용하면 됩니다.

리눅스를 설치하면 FTP 프로그램은 다행히 깔려있지않습니다. 그래서 딱히 설정해줄 것은 없고, 추후 FTP를 사용하지않길 권장합니다. 

SFTP은 SSH 서비스만 활성화되어있으면 접속할 수 있습니다.



4. 일반계정 접속시 노출 디렉토리 퍼미션 변경

일반계정으로 접속하면 자신의 홈디렉토리가 먼저 노출되게 됩니다. 하지만 자신의 홈디렉토리 이외의 상위 디렉토리 또한 같이 노출됩니다. 이 문제는 바로 상위 디렉토리가 공개 읽기 퍼미션을 갖고 있기 때문에 그렇습니다.


그래서 다른 사용자에게 노출되기 원치않는 디렉토리는 퍼미션을 변경하는 것이 좋습니다. (755->701)

저는 홈 디렉토리 퍼미션을 변경했습니다.


# chmod 700 /home/system



5. tmp 디렉토리 보안

웹 서버를 운영하면 tmp 디렉토리의 역할이 중요해집니다. 이 디렉토리는 아무나 읽고, 쓰고, 실행할 있도록 기본으로 셋팅되어져있습니다. 그렇기때문에 웹에서 tmp 디렉토리에 악성파일을 넣는 것이 가능합니다. 만약 악성파일이 실행되기라도 한다면 보안에 치명적이겠죠.


애초 OS 설치시 tmp 파티션을 따로 나누어 설치하는 것이 좋습니다. 그렇지않다면 tmp 파티션을 따로 나눌 필요가 있습니다.


* 주의 : tmp 디렉토리를 사용하는 프로세스가 구동중이라면 관련된 프로세스를 중단한 상태에서 작업을 진행하세요. (nginx, php, mysql등..)


A. 파티션 확인 / tmp 디렉토리 백업

tmp 파티션이 있는 지 확인합니다.


# df -h


tmp 491M 0 491M 0% /tmp

이런 /tmp 항목이 없다면 파티션이 없는 겁니다.


작업 마지막 단계에 복원할 tmp 디렉토리 백업본을 만듭니다.

# cp -Rp /tmp /tmp-backup 

# cp /etc/fstab /etc/fstab.backup



B. tmp 파티션이 없는 경우 (/tmp 디렉토리만 있음)

파티션이 있는 경우는 아래 작업을 수행할 필요없이 C 단계를 수행하면 됩니다.

 

* 파티션 생성및 포맷

# cd /var 

# dd if=/dev/zero of=tmpmount bs=1 count=0 seek=원하는 파티션 용량. 예)5G

# mkfs.ext4 /var/tmpmount


* /etc/fstab 에 파티션 내용 추가

# echo "/var/tmpmount /tmp ext4 defaults,nodev,nosuid,noexec 0 0" >> /etc/fstab


* /tmp 파티션 마운트

# mount -o defaults,nodev,nosuid,noexec /var/tmpmount /tmp


* 소유권과 사용권한 부여

# chmod 0777 /tmp 

# chown root.root /tmp



C. 이미 tmp 파티션이 존재하는 경우

이 경우 간단히 /etc/fstab에서 tmp 파티션부분을 변경하면 됩니다.


* /etc/fstab 파티션 속성추가

# vi /etc/fstab


UUID=....    /tmp    ext4    defaults,nodev,nosuid,noexec    1  2

위 처럼 tmp 파티션부분에 부분색 부분을 추가하면 됩니다.


nodev : 장치 사용 금지

nosuid : root 권한 금지

noexec : 바이너리 파일 실행금지


* 파티션 재 마운트

# mount -o remount /tmp



D. /tmp 디렉토리 복원 및 /var/tmp 심볼릭 링크


* /tmp 복구와 백업 삭제 (아까 백업한 tmp 데이터 복원)

# cp -Rp /tmp-backup/* /tmp/

# rm -rf /tmp-backup


* /var/tmp 심볼릭 링크

# rm -rf /var/tmp/

# ln -s /tmp/ /var/tmp


/var/tmp 디렉토리를 제거하고, 보안 작업된 tmp 디렉토리를 사용하도록 심볼릭 링크를 겁니다.


* 재부팅

# reboot



6. 시스템 중요파일 속성변경

일반계정 사용자가 시스템 파일을 악용하여 위험에 빠지게 할 수 있습니다. 따라서 시스템 중요 파일의 속성을 변경하여 일반계정 사용자가 함부로 사용하지못하게 할 필요가 있습니다. root 계정만 사용할 수 있도록 변경해보겠습니다.


파일의 퍼미션을 100으로 변경해 소유자 root만 실행할 수 있게 하고, +i 옵션을 부여해 파일의 복사/수정/삭제를 금지합니다.


* gcc, g++ 컴파일러

# chmod 100 /usr/bin/gcc /usr/bin/g++ 

# chattr +i /usr/bin/gcc /usr/bin/g++


@ g++은 기본 설치가 아니므로 필요하면 따로 설치해야합니다. yum install gcc-c++ 


* ps 명령 (프로세스 관리)

# chmod 100 /bin/ps

# chattr +i /bin/ps


* ping 명령

# chmod 100 /bin/ping

# chmod 100 /bin/ping6


* 그이외의 관리자 명령어

# chmod 750 /usr/sbin/useradd

# chmod 750 /usr/sbin/userdel

# chmod 750 /usr/sbin/usermod

# chmod 750 /usr/bin/top

# chmod 750 /sbin/fdisk

# chmod 750 /sbin/mkfs*

# chmod 750 /sbin/fsck*


# chmod 100 /usr/bin/pstree 

# chmod 100 /usr/bin/w 

# chmod 100 /usr/bin/who 

# chmod 100 /usr/bin/find 

# chmod 100 /bin/df 

# chmod 100 /bin/netstat 

# chmod 100 /sbin/ifconfig 

# chmod 100 /usr/bin/make


# chmod 700 /usr/bin/wget 

# chmod 700 /usr/bin/curl


# chattr +i /usr/sbin/useradd

# chattr +i /usr/sbin/userdel

# chattr +i /usr/sbin/usermod

# chattr +i /usr/bin/top

# chattr +i /sbin/fdisk

# chattr +i /sbin/mkfs*

# chattr +i /sbin/fsck*


chattr +i를 적용하면 yum 업데이트를 할 수 없습니다. 그럴때는 chattr -i 로 해제하면 됩니다.



7. ping 테스트 응답차단

고전수법이지만 ping으로 서버속도를 저하시킬 수 있습니다. 그래서 ping 응답을 미리 차단시킬 필요가 있습니다.

ping을 차단 하려면 net.ipv4.icmp_echo_ignore_all 설정을 1로 변경하면 됩니다.


# sysctl -a | grep net.ipv4.icmp_echo_ignore_all


net.ipv4.icmp_echo_ignore_all = 0


그러면 설정 값을 변경해봅시다.


# vi /etc/sysctl.conf


/etc/sysctl.conf 파일 하단에 아래 설정값을 입력하고 저장시키면 됩니다.

net.ipv4.icmp_echo_ignore_all=1


이 변경을 재부팅을 해야 적용됩니다. 재부팅 없이 일시적으로 변경하려면 아래 명령을 실행하면 됩니다.


# /sbin/sysctl -w net.ipv4.icmp_echo_ignore_all=1


이제 ping [서버ip] 이렇게 해봐도 아무런 응답이 없게 되었습니다.



8. SetUID, SetGID 점검

리눅스 해킹의 대부분은 SetUID, SetGID를 이용해 이루어지고 있다고 해도 과언이 아닙니다. 때문에 이 보안점검은 아주 중요한 점검이 될 것입니다.


SetUID(퍼미션 : 4000), SetGID(퍼미션 : 2000)은 파일에 부여하는 퍼미션 속성의 일종입니다. 이 속성이 부여된 파일을 실행할 경우 사용자 권한으로 실행되는 것이 아니라 해당 파일의 소유자(SetUID)나 그룹(SetGID)의 권한으로 실행됩니다. 예를 들어 파일의 소유자가 root이면 파일을 실행할 동안 잠깐 root 권한을 얻게 됩니다.


따라서 이를 악용한다면 root 권한을 획득해 마음대로 시스템을 제어할 수 있을 것입니다.


보안 취약점 생길 수 있는 SetUID, SetGID가 왜 필요할까요?

퍼미션 4000대(SetUID)가 부여된 /usr/bin/passwd 파일을 예로 들어 보겠습니다. /usr/bin/passwd 파일은 passwd 명령어 파일입니다. 그리고 passwd는 계정 비밀번호를 변경할때 사용하는 명령어입니다. 원래 계정 비밀번호 변경은 관리자(root)의 고유권한이 였습니다. 하지만 일반사용자는 직접 비밀번호를 변경하길 원했습니다. 그 결과 /usr/bin/passwd 파일에 파일소유자 root 권한을 잠깐 빌려주는 SetGID 속성이 부여된 것입니다. 일반계정에서 비밀번호 변경이 가능한 것도 passwd 명령을 실행할때 root 권한이 잠깐 부여된 덕분입니다.


이런 장점도 있지만, 보안에 취약하다는 단점도 있습니다. 그렇기에 SetUID, SetGID 점검이 필요한 것입니다.


방법은 간단합니다. root 소유의 파일중 퍼미션 4000(SetUID), 2000(SetGID)이 부여된 파일들을 찾아 일반사용자에게 굳이 필요하지않는 파일은 SetUID, SetGID 속성을 제거하면 됩니다. 아래 명령어를 이용하면 해당 파일을 찾는 데 도움이 될 것입니다.


퍼미션 4000(SetUID)이 부여된 root 소유파일 찾기

# find / -user root -perm -4000 -print


퍼미션 2000(SetGID)이 부여된 root 소유파일 찾기

# find / -user root -perm -2000 -print


* 필요없는 파일 퍼미션 변경 (조치)

# chmod 100 /bin/ping


/usr/bin/chsh

/usr/bin/gpasswd

/usr/bin/wall

/usr/bin/write

/usr/bin/chage

/usr/bin/chfn

/usr/bin/at

/usr/bin/mount

/usr/bin/umount

/usr/bin/crontab

/usr/bin/newgrp

/usr/sbin/usernetctl

/bin/ping


/usr/bin/sudo

->sudo 명령은 su 명령으로 대체할 수 있습니다. 안쓸거면 필요없죠..


위 파일들은 SetUID, SetGID 속성을 가졌음에도 불구하고, 일반 사용자에게는 굳지 필요없는 파일들입니다. 퍼미션 변경 조치를 해주세요.


  • ?
    누구니이넌 2017.11.30 14:12:27
    코노리님 1,2 번 적용후 사용자계정으로 ftp파일 업로드가 예를들어 xe폴더내에는 되는데 애드온폴더 모듈폴더에는 업로드가 안되는데 어딜 수정해야 하나요?
  • ?
    누구니이넌 2017.11.30 14:14:33
    서버는 우분투서버 16.04 LTS
?