Linux

Linux #13

broom7946 2023. 2. 9. 17:19

Linux 서버 시스템 보안

  Linux 서버를 한동안 운영하면 여러 사용자나 시스템 설정, 그리고 서버 서비스에 관한 정보들이 들어있게 된다. 서버 서비스들이 정상으로 운영되기 위해서 그리고 사용자들의 정보가 외부로 노출되지 않게 하려면 서버 머신에 보안을 설정해 두는 것이 필요하다. 

  서버 시스템에 보안을 설정할 때에는 다음과 같은 기본적인 원칙이 있으므로 이에 따라서 설정해주는 것이 좋다.

꼭 필요한 프로그램만 설치하고 사용자 접근을 최대한 제한한다.

관련 프로그램(응용프로그램, 안티바이러스 프로그램, 패치 등)들을 자주 업데이트한다.

사용자에 대한 정확한 정보(계정관리, 패스워드, 권한 등)를 늘 최신으로 유지한다.

시스템 보안의 목표를 비밀성(confidentiality), 무결성(integrity), 가용성(availability), 기록성(recording), 부인봉쇄(non-repudiation)라는 측면을 염두에 두고 설정한다.

 

  보안은 예측 가능한 위험을 줄이는 것이 목적이다. 따라서 인증된 해킹을 통한 취약점 분석이 중요하다. 통이 물에 새는지 확인하기 위해서는 물을 부어봐야 알 수 있는 것과 같다.

손실의 우려가 있는 정보와 정보자산(인적, 기술적, 물리적)을 타겟으로 하는 위험(risks)과 위협(threats), 그리고 보안상 문제가 있을 수 있는 취약점(vulnerability)이 겹쳐지는 곳에서 시스템/네트워크가 위험(endangered)해진다.

  정보 보호를 위한 대응 기준은 여러 가지가 있지만 보통 영국에서 마련한 BSI(British Standard Institution) 지침을 따른다. 대응절차를 제외한 보안에 대한 기본방향과 침해사고 시 대응기준을 합해서 정보보호 정책이라고 부르는데 보안을 준수할수록 그만큼 사용상 편리함을 포기한다는 의미가 들어있다.

 

  어느 외국계 기업체에서의 서버()에 관한 보안지침을 정리한 것이다.

① 통풍, 환기, 습도 등이 잘 조절되는 서버 룸에 서버를 설치하고 출입을 엄격히 통제한다.

② 전원 공급기를 안정시키기 위해서 UPS(Uninterrupted Power Supply)를 사용한다.

③ 데이터가 외부로 유출되지 않도록 이동 매체(USB, SD-card, DVD, 메일, ...) 사용을 금하는 서버 시스템 설정과 BIOS 설정 화면에 암호를 걸어둔다. 

④ 사용자의 작업 디렉터리는 디스크 쿼터를 걸 수 있도록 별도의 HDD를 추가해서 사용한다.

⑤ 시스템 파일은 변경되지 않도록 읽기만 가능하게 해두고 수시로 백업해둔다.

⑥ 시스템에 소프트웨어 설치를 최소한으로 해서 쓸데없는 보안상 허점이 없게 한다.

⑦ 부트 로더에 암호를 걸어서 시스템의 부팅설정을 변경하지 못하게 한다.

⑧ 시스템 서비스와 서버 서비스 데몬을 최소한으로 설치하고 설정한다.

⑨ 관리자의 패스워드를 주기적으로 변경한다.

⑩ 사용자 계정 관리를 철저히 한다. 등등...

  이런 것들이 서버 시스템 보안에서 필요한 일들이다. 여기서

시스템이란 보통 서버 호스트 머신을 말하고,

네트워크는 호스트, 프린터, 라우터나 스위치 등과 같은 노드로 구성된 일단을 말한다. 

 

  Linux 서버에서의 기본 보안상 주의 점으로

a) 수시로 Hot Piece Bug Fix가 이뤄지므로 항상 최신의 상태가 유지되도록 정기적인 업데이트가 중요하다.

b) 시스템/네트워크에 패치를 업데이트할 때에도 미리 서버 시스템과 두어 대의 클라이언트    시스템으로 이뤄진 Pilot System에 먼저 패치를 적용시켜서 문제가 없는지 관찰한 뒤에 네트워크에 뿌려야 한다.

c) 또 시스템과 소프트웨어 설정에 보안을 지정하는데, 파일/디렉터리에도 적절한 권한을 설정하며, 하드웨어적인 저장장치에 BitLocker(TrueCrypt, Luks, Encrypt) 등으로 암호화해 두어야 한다.

d) root 계정의 로그인을 자제하고, su 명령어 사용자도 제한하며, sudo를 사용하게 한다.

e) 시스템 모니터링과 분석도 수시로 수행하고,

f) 로그파일 관리에도 주의해야 한다.

g) 방화벽(FW)뿐만 아니라 침입탐지(IDS)와 침입예방(IPS) 시스템도 라우터(게이트웨이)에서 적절히 설정해 두어야 하고,

h) 침해 사고 시 피해를 최소한으로 만들기 위해서 SELinux로 중요한 파일과 프로세스별로 권한을 세분화 시켜둔다.

i) BIOS를 조절해서 외부 USB DVD 등으로 시스템이 부팅되는 것을 막도록 CMOS 설정에 패스워드를 걸어두는 것도 좋은 방법이다.

j) 그리고 다음도 중요한 보안상 설정이다. 몇 가지를 알아보자.

a. 기본 컴파일러인 gcc/c++ root만 사용하도록 퍼미션 변경하기

  =>chattr를 사용해서 파일의 속성 변경 막기

  =>gcc g++은 모두 GNU C/C++ 컴파일러로써

gcc ~.c ~.cpp 파일을 C C++로 구별해서 컴파일하고,

g++ ~.c ~.cpp 파일을 모두 C++ 파일로 취급해서 컴파일 한다는 면에서 조금 다르다

b. 주요 명령어와 환경 설정파일, 서비스 데몬 등 백업 해두기

  =>중요한 명령어가 들어있는 /usr/bin 디렉터리와

    시스템 설정 명령어가 들어있는 /usr/sbin,

    각종 설정파일들이 있는 /etc/, 그리고

    부팅과 관련된 /boot,

    Linux 운영체제가 들어있는 하드디스크 /dev/sda2(lsblk 해보면 확인할 수 있다)를 다른 디스크에 백업해두는 것이 좋다.

c. chkconfig로 시작 서비스를 런레벨 별로 제한하기

=>불필요한 서비스가 실행되면 시스템의 리소스를 소비하기 때문이다. root 권한으로 쓸데없이 실행되고 있는 어느 서비스 파일을 악성코드 파일로 변경해두면 악성 파일이 실행되게 된다.

d. xinetd 슈퍼 데몬에 관한 보안도 주의한다.

=>슈퍼데몬의 /etc/xinetd.d 디렉터리 아래에 있는 rsync, telnet, 그리고 지금의 backdoor 등이 모두 차일드 데몬인데 설정파일에서 includedir /etc/xinetd/ 때문에 /etc/xinetd 아래에 있는 Telnet으로 연결하면서 포트를 23으로 하면 순수 Telnet으로 연결되고, 포트를 12345로 하면 백도어로 연결된다.

  이 차일드 데몬 중 하나를 실행시키면 슈퍼데몬이 포트를 보고 해당 차일드 데몬이 응답하게 되는 것을 악용한 멋진 공격법이다. 실습 상 backdoor로 이름을 지정했지만 기존의 rsync 파일의 내용을 이런 식으로 변경해두면 rsync로 연결할 때 해킹된다. 이런 파일의 내용도 보안 상 관리해둘 필요가 있다.  

e. SSH 등 원격 연결을 사용자와 포트로 제한하기

=>/etc/ssh/ssh_config 파일에서 조절한 대로 작동된다.

f. 패스워드와 root 로그인 콘솔에 관한 보안도 주의한다.

=>/etc/login.def 파일의 설쟁대로 작동된다.

=>/etc/securetty에서 열려있는 포트는 규제되는 포트이다.

터미널   설명

console 사용자와 컴퓨터가 주고받는 일반적인 인터페이스를 말한다.

tty        (Tele-TYpewriter) tty1~tty11까지 있는데 root가 이 가상 터미널을 통해서 접속할 수 있다. 보통 tty0는 모니터/키보드에게 할당되고, tty1 이상부터 가상콘솔이 된다. 따라서 tty1만 놔두는 것이 보안에 좋을 수 있다. 보통 런레벨3 CLI에서 실행되는 콘솔이다. terminal이라고도 한다.

ttys      (TTYserial) IoT Arduio 등에서 외부와 Serial 접속 시 열리는 CLI 콘솔이다.

vc        (virtual console) pts(Pseudo Terminal Slave)로써 X manager에 의해서 X.org 접속 시 열리는 GUI 콘솔로 telnet, ssh terminal 접속     시 사용된다. pts/1~pts/11로 표시되는데 원격지에서 root 접속을 막으려면 이 화면을 비워두거나 필요한 console, vc1, tty1만 주석#을 제거해두면 된다. 런레벨5 GUI에서 실행하는 콘솔이다. vc /dev/pts이다.

pty       (Pseudo Terminal device) GUI 환경의 xterm, screen 등에서 사용되는   터미널로써 보통 게임기 등에서 열리는 그래픽/텍스트의 가상콘솔이다.

hvc     (HyperVisor Console) HyperVisor Serial 연결을 위한 콘솔이다.

g. su sudo 사용자 제한하기

=>/etc/suoders 파일에 사용자가 기록되거나 %wheel 그룹의 일원이 되면 sudo 명령어를 사용할 수 있다.

=>/etc/pam.d/su에서 지정하면 이 설정이 우선한다.

ls -l /usr/bin/su 하면

-rwsr-xr-x. 1 root root 32128 Oct  1  2020 /usr/bin/su식으로 보인다.

여기서 이 파일은 root 사용자와 그룹 소유이므로 root만 실행할 수 있지만 user에서

rwx 대신 rws가 있다. s sticky bit라고 하는데 누구나 사용할 수 있는 설정이다.

h. 사용자 패스워드 관리하기

=>chage centos식으로 해서 패스워드 설정에 대한 설정을 해줄 수 있다.

i. 중요 명령어를 root만 실행시키기

=>해커가 자주 사용하는 useradd, crond, top, fdisk, mkfs 등의 명령어를 관리자만 사용하도록 속성을 변경하고, 외부에서 속성변경을 막기 위해서 chattr +i 옵션을 준다

=>어느 사용자의 홈 디렉터리 밑에 /bin 디렉터리를 만들고 거기에 실행 파일을 넣어두면 해당 사용자는 어디서나 그 프로그램을 실행할 수 있다. 프로그램 실행에서 경로설정은 중요하므로 잘 알아두어야 한다.

<=따라서 해커가 일반 사용자로 악성 코드를 생성해서 해당 사용자의 $HOME/bin에 넣어두면 해당 사용자 이름으로 실제 악성코드가 저장된 위치 이외의 어디서나 그 코드를 실행할 수 있어서 매우 위험해진다.

=>일반 사용자의 $HOME/.bash_profile 파일에서 ~ /bin 디렉터리를 빼주는 것이 좋다

j. 커널이나 시스템 정보를 알려주는 배너(banner) 파일 관리하기

=>타겟머신의 특정 포트에서 실행되고 있는 서비스의 배너를 보고 버전 등의 정보를 알아낸 뒤 침투할 수 있기 때문에 이를 감추는 것이 좋다.

/etc/issue, /etc/issue.nt, /etc/redhat-release, /etc/motd(Telnet, SSH 로그인 등에서 정보를 보임)

=>하지만 최근 머신에서는 배너 정보를 잘 보이지 않게 하고 있다.

 

k. 가상 파일시스템인 /proc 파일 조정하기

=>/proc를 통한 시스템 설정과 외부 공격 막기

  Linux 시스템은 시스템이 부팅할 때 하드디스크에 저장된 /etc/sysctl.conf 파일에 설정된 커널 값을 사용한다. 하지만 시스템은 하드디스크에서 정보를 읽는 것보다 메모리에서 정보를 읽는 것이 1,000배는 빠르므로 하드디스크 /etc/sysctl.conf 파일에 설정된 커널 값을 메모리의 /proc 디렉터리에 올려두고 사용한다. 메모리에 있는 /proc 파일시스템은 하드디스크에 있는 /etc/sysctl.conf 파일의 복사본이라고 볼 수 있다. 커널에 대한 modular 방식과 monolithic 방식의 차이와 유사한 개념으로 볼 수 있다.

 

  /etc/sysctl.conf Windows에서의 레지스트리와 유사한 개념으로 여기서 설정한 대로 머신이 실행된다. /etc/sysctl.conf 파일에서 커널의 설정 값을 변경하면 /proc 파일시스템에 바로 변경이 반영된다. 따라서 시스템 설정파일 /etc/sysctl.conf에서의 각 설정값과 가상 파일시스템 /proc 디렉터리의 각 파일에서의 설정 값은 같다. 하지만 머신이 꺼지면 메모리의 정보가 휘발성(volatile)이어서 모두 없어지므로 /proc의 내용이 모두 없어지고 하드디스크에 있는 /etc/sysctl.conf 파일의 설정만 존재하게 된다. 

  예를 들어서 시스템 사용 중에 보안에 대한 SELinux setenforce 0 해서 일시적으로 Permissive로 해두는데, 이는 메모리의 /proc에서의 설정이기 때문에 현재 실행되는 시스템에서 일시적으로 적용되는 설정이고 머신이 리부팅되면 메모리에서 이 정보는 사라지고 원래 HDD /etc/selinux/config 에서의 설정이 적용되어 다시 Enforcing이 되는 것을 생각해보면 이해가 될 것이다.

 

  /proc 파일시스템은 메모리상에서 실행되고 있는 모든 Linux 커널 자원들에 대한 정보를 PID로 구별해서 보관하고 있다. 하지만 이 /proc 파일의 값은 물리적으로 존재하는 것이 아니라 머신이 실행되는 동안만 메모리에 일시적으로 존재하기 때문에 /proc '가상 파일 시스템'으로 부른다. 따라서 /proc 파일시스템에서 중요한 설정을 변경하고 재부팅 후에도 계속 그 설정이 적용되게 하려면 하드디스크에 있는 /etc/sysctl.conf 파일에 설정을 저장해 두어야 한다.

=>이렇게 메모리에서 실행되고 있는 /proc에서의 설정값을 변경하면 HDD /etc/sysctl.conf 파일에서 일일이 항목을 찾아서 값을 변경하고 저장해서 적용시키는 것보다 1,000배는 빠르므로 급한 해킹을 막을 때에는 최적의 도구가 될 수 있다.

=>CentOS 7에서는 /etc/sysctl.conf 파일에 설정을 넣어줄 수 있다.

  시스템 설정을 조정할 필요가 있으면

가상파일인 /proc 디렉터리내의 해당 파일에서 변경하지 말고

실제 물리적 파일인 /etc/sysctl.conf 파일에서 변경해주는 것이 시스템을 안정되게 해준다.

  여기서의 설정 값을 변경할 때에는 보통 세 가지 방식으로 하는데,

nano /etc/sysctl.conf 해서 파일을 열고 원하는 파라미터_변수의 값을 변경하거나,

echo “” >> /proc/파라미터_변수 해서 /proc에서의 파라미터_변수의 값을 변경하거나

sysctl –w 파라미터_변수=값 해서 원하는 파라미터_변수의 값을 변경해서 물리적으로 변경해도 일시적으로 /porc에만 적용되는 값이 된다.

④ 확인은 sysctl -p

  OR cat /etc/proc/sys/net~ 해주면 된다.

 

Telnet, FTP SSH, HTTP 서비스와 열린 포트 등 조절하기

 =>연결시간 조절(/proc/sys/net/ipv4/tcp_fin_timeout), 연결유지 시간 조절(/proc/sys/net/ipv4/tcp_keepalive_time), 아는 포트(/proc/sys/net/ipv4/ip_local_port_range)로만 접속제한, ....

SYN Flooding 공격 막기

=>SYN Flooding 공격은 두 노드간 TCP 연결의 3-way handshakes를 이용한 일종의 DoS(Deny of Service) 공격이다. 일반적으로 TCP에서의 3-way handshakes 연결은 클라이언트가 먼저 서버에게 SYN를 보내서 서버와 연결을 요청하면 >서버는 SYN+ACK를 클라이언트에게 보내서 연결을 기다리고 >클라이언트가 ACK를 서버로 보내서 서로 연결되는 과정을 가진다.

  하지만 클라이언트(해커)는 이런 연결을 교묘하게 속여서 침투하는데

a. 클라이언트가 서버에게 SYN1를 보내고,

b. 서버가 SYN1+ACK1을 보내오면,

c. 클라이언트가 ACK1을 응답으로 보내서 연결하지 않고,

   또 다른 SYN2를 보낸다.

c. 이제 서버로부터 SYN2+ACK2를 받았을 때,

d. ACK2를 응답으로 보내지 않고,

   SYN3를 보내고,...하는 식으로 계속 SYN만 보내고 연결을 맺지 않는 공격이다.

e. 그러면 서버는 각각의 연결요청 SYN1, SYN2, SYN3, ...를 로그에 파일로 저장해 두고 포트를 열어두고 각각의 ACK를 기다리는데 이를 half-open 상태로 부른다.

  계속된 SYN 요청으로 인해 연결 설정을 저장해두는 로그파일(Backlog Queue라고 함)의 용량이 다 차면 서버가 서비스 불능이 되게 된다.

=>이런 syn_flooding 공격을 막으려면 서버의 로그가 저장되는 이 backlog queue 용량을 늘려서 syn_flooding 공격을 견뎌낼 동안 관리자가 조치를 취해서 막으면 된다.

Smurf / Land 공격 막기 

ICMP Redirect 막기

Reverse Path Filtering으로 DDoS(IP spoofing) 막기 

Faked(Rogue) IP Filtering 하기

Source Route 패킷 전송 막기

ping이나 tracert에 응답하지 않기