Ubuntu/Debian Basic Security settings
리눅스 시스템을 설치후 기본적인 보안 설정과 도구를 사용하는 과정을 정리했다.
- firewall 과 sshd
- rootkit
- fail2ban
Firewall과 ssh 보안 구성
사용자 로그인에 제약을 두고, 원격 접속에 대해서 방화벽과 sshd 보안을 강화한다.
sudoer 등록
처음 로그인후 새로운 사용자 등록하고 suders에 직접 권한을 줄 수 있다.
sudo 새 사용자 등록
sudo 사용자를 추가해서 사용하려면, adduser 혹은 useradd 명령을 사용해서 사용자를 등록 할 수 있다.
새 사용자 등록
먼저 adduser를 사용한 등록은,
1 | # adduser qkboo |
useradd
는 홈 디렉토리, 쉘 등에 대한 옵션을 주고 사용자를 등록한다.
‘useradd‘ 명령은 크게 두가지 일을 한다:
- 추가한 사용자에 대한 /etc/passwd, /etc/shadow, /etc/group and /etc/gshadow 편집
- 사용자 홈 디렉토리 생성
1 | $sudo useradd -m qkboo |
그리고 패스워드를 등록한다.
1 | $ sudo passwd qkboo |
userdel 로 사용자 완전 삭제시
1 | $ userdel -r sambaguest |
visudo
visudo 명령으로 sudoers 파일을 편집할 수 있다. sudoer에 있는 root는 제외하고 사용자로 등록한다.
1 | $ sudo visudo |
sudo 사용자를 sudo 그룹에 등록해 둔다.
1 | $ sudo usermod -aG sudo pi |
ufw를 사용한 방화벽 등록
1 | $ sudo apt install ufw |
방화벽 기본 규칙을 실행한다.
1 | $ sudo ufw default deny incoming |
리눅스 방화벽 구성에 대해서는 포스트 UFW Firewall on Ubuntu/Debian 에 자세히 설명하고 있다.
1 | $ sudo ufw allow ssh |
그리고 ufw로 방화벽을 활성화 한다.
1 | $ sudo ufw status |
현재 서버의 열린 포트는 다음 같이 netstat
명령으로 확인이 가능하다.
1 | $ netstat -tlnp |
ping (icmp) 허용/거부
UFW 기본설정은 ping 요청을 허용하도록 되어있다. 이것은 /etc/ufw/before.rules
파일에 정의되어 있는데 여기서 icmp 프로토콜 관련한 항목을 DROP으로 처리하거나 삭제하면 ping을 방지할 수 있다.
1 | # ok icmp codes |
samba 허용
1 | $ sudo ufw allow Samba |
syslog 에 패킷 필터링 결과를 로깅 하려면,
1 | $ sudo ufw logging on |
리눅스 방호벽에 ssh 허용한다. ufw를 사용한다면 다음 같이 해준다.
ssh 보안
ssh Brute-force Attack 방어
1 | $ sudo ufw limit ssh |
ssh를 특정 IP 주소에만 접속을 허용한다
1 | sudo ufw allow from 192.168.0.100 to any port 22 |
1 | sudo ufw allow from 192.168.0.100 to any port 22 proto tcp |
sshd 보안 구성
ssh 사용에 특정한 사용자, 호스트 등에서만 사용하도록 제한하게 구성한다.
sshd_config 수정
/etc/ssh/sshd_config에서 다음 내용으로 수정한다.
포트, IP, Time out 시간을 지정할 수 있다.
1 | #sshd 포트넘버 변경 (Port) |
사용자 계정에 대한 접근
1 | # no로 설정하면 root 계정으로 Login 불가능. |
issue 이용
ssh 로그인시 Banner로 지정한 Text File의 내용을 Login Prompt에 출력한다. 시스템 접근에 대한 사전 경고이다.
/etc/ssh/sshd_config 에 Banner를 추가한다.
1 | # 설정한 경로에 존재하는 Text File의 내용을 Login Prompt에 출력. |
그리고 /etc/issue.net 파일에 다음 경고를 넣어준다.
1 | > *************************************************************************** |
systemd 를 사용하면,
1 | $ sudo systemctl restart sshd.service |
upstart를 사용하면,
1 | $ sudo service ssh restart |
공개키 방식을 이용
일반 패스워드를 사용하는 로그인 방식보다 rsa 키를 이용한 접속이 보다 보안에 좋다. 그리고 일단 한번 설정해 놓으면 편하다.
서버에 /etc/ssh/sshd_config
설정에서 rsa키 사용에 대한 설정이 제대로인지 살펴본다.
1 | PubkeyAuthentication yes |
ssh 클라이언트
클라이언트에서 공개키 생성을 한다. 키의 크기를 높이려면 -b
옵션으로 1024, 2048, 4096 값을 제시한다.
1 | (CLIENT)$ mkdir ~/.ssh |
개인 비밀키와 공개키 파일이 ~/.ssh 폴더에 기본 파일이름 id_rsa.pub, id_rsa.prb 파일로 저장된다.
서버에서 할일
서버에서 비밀키를 생성한다.
1 | (SERVER)$ ssh-keygen -t rsa -b 4096 -C "USER@SERVER" |
클라이언트 공개키를 서버 배포
서버로 id_rsa.pub를 scp 로 복사해서 authorized_keys 파일에 더해주면 된다. 아래 같이 할 수 있다.
1 | cat ~/.ssh/id_rsa.pub | ssh USER@SERVER 'cat >> .ssh/authorized_keys' |
scp로 복사하고 서버에서 authorized_keys 파일에 더해줄 수 있다.
1 | (CLIENT)$ scp ~/.ssh/id_rsa.pub USER@SERVER:~/client.pub |
이제 해당 서버로 로그인해 본다.
아래 같이 시스템 명칭을 주고 생성할 수 도 있다.
1 ssh-keygen -t rsa -C "Raspberry Pi #123"
권한은 아래와 같이 클라이언트와 서버 모두 설정한다.
1 | chmod 600 ~/.ssh/id_rsa |
그리고 클라이언트에서 서버로 ssh 접속을 해본다. 로그인 과정 없이 로그인되면 공개키 방식의 인증이 마무리되ㅓㅇㅆ다.
1 | (CLIENT)$ ssh USER@SERVER |
개인키 파일을 이용한 로그인
-i 옵션을 이용하면 개인키를 여러개 만들어 두고 서버 마다 달리 로그인 할 수 있다.
1 | ssh -i .ssh/개인키 id@host-Name |
Root kit
chkrootkit
- 루트킷 탐지 프로그램
- 일반적인 루트킷, 커널 기반 루트킷, Worm 까지도 탐지 가능
설치
1 | $ sudo apt install chkrootkit |
컴파일로 빌드 설치시 http://www.chkrootkit.org/
에서 다운로드후 빌드한다.
1 | $ tar -zxvf chkrootkit.tar.gz |
루트킷 실행
1 | $ sudo chkrootkit |
not infected
, not found
가 아닌 경우 잘 살펴보자.
rkhunter
Rootkit이 System에 설치되어 있는지 Check합니다. chkrootkit
에서 검사하지 않는 설정 파일들이나 서버 계정 등 을 검사 하기 때문에 chkrootkit 과 함께 사용하면 좋다.
1 | $ sudo apt install rkhunter |
- 설치 시에 MTA(Matil Transfer Agent)인 Postfix가 의존성으로 같이 설치됩니다.
RPi Jessie에서 설치시 rkhunter Invalid SCRIPTWHITELIST configuration option: Non-existent pathname: /usr/bin/lwp-request 경고 발생
lwp-request
는 명령행 HTTP 사용자 에이전트로 사용하지 않는다면 > /etc/rkhunter.conf에 있는 SCRIPTWHITELIST /usr/bin/lwp-request 주석 처리
참조: lwp-request
실행
1 | $ sudo rkhunter -c |
skip
1 | $ sudo rkhunter -c --skip-keypress --pkgmgr dpkg |
1 | $ sudo rkhunter -c -sk // --skip-keypress |
update
properties update
1 | $ sudo rkhunter --propupd |
업데이트 점검
1 | $sudo rkhunter --update |
cron 설정
1 | $ sudo vi /etc/default/rkhunter |
자세한 결과가 저장된 /var/log/rkhunter.log의 내용을 토대로 Google에서 검색하거나 Rkhunter Users Mailing List를 이용한다.
/var/log/rkhunter.log
## Fail2ban
로그를 검사해 의심스런 IP 를 찾아 Firewall rule에 등록해 관리하는 것은 어려운 과정이다. Fail2ban은 정규표현식을 사용해서 로그에서 의심스런 IP를 찾아 Firewall 등록 할 수 있도록 해준다.
설치
fail2ban
은 iptables
패키지와 함께 설치한다.
1 | $ sudo apt install iptables fail2ban |
그리고 systemctl
로 재대로 서비스가 시작되는지 확인해 본다.
1 | $ sudo systemctl restart fail2ban.service # 재시작 |
설정을 위해서 fail2ban
설정 파일인 fail2ban.conf, 그리고 jail 파일 jail.conf 파일을 .local
파일로 복사한 사용자 정의 파일에서 사용한다.
1 | $ cd /etc/fail2ban |
/etc/fail2ban 디렉토리
주요 파일,
- fail2ban.local :
fail2ban
주요 설정 파일 - jail.local: jail 설정 파일
- jail.d/defaults-debian.conf: jail enable/disable
- paths-common.conf: 로그 파일 경로
- paths-debian.conf: 로그 파일 경로
fail2ban.local
fail2ban 에서 전역 설정을 무선언해 줍니다. 예를 들어 검출된 IP중에 무시할 영역을 선언해 줍니다.
1 | [DEFAULT] |
jail.local
jail.d/defaults-debian.conf 파일에 jail 을 활성화 혹은 비활성화 시킨다. 기본으로 sshd 만 활성화 되어 있다. 아래는 nginx 에 대해서도 활성화 했다.
1 | [sshd] |
시스템 서비스 포트 확인
현재 시스템의 활성화되어 있는 포트는 netstat
명령으로 확인할 수 있다.
1 | $ sudo netstat -tulpen |
열려 있는 포트를 fail2ban 의 jail을 활성화해서 방화벽으로 감시하면 된다.
fail2ban 사용
fail2ban-client, fail2ban-regex 명령을 이용해 jail의 ban 상태를 확인하거나 테스트 할 수 있다.
Jail 실행 확인
fail2ban-client 명령으로 해당 jail을 확인 할 수 있다.
1 | $ sudo fail2ban-client status |
전체 jail 중에 특정한 것만 확인한다.
1 | Status for the jail: ssh |
테스트
의심스런 동작을 Filter로 선언해서 사용하는데 해당 필터를 점검해야할 필요가 있다. 다음
1 | $ sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf |
lastb
실패한 로그인 시도
View Failed Login Attempts – lastb 참조.
-w
로 사용자 이름을 출력하고 첫번째 열만 자른 후 정렬한 후, uniq
명령으로 중복되는 이름을 제거한 후 출력한다.
1 | $ sudo lastb -w | cut -d " " -f 1 | sort | uniq | less |
이중에서 접속한 IP와 횟수를 출력한다.
1 | $ sudo lastb -f /var/log/btmp.1 -w -i | awk '{print $3}' | sort | uniq --count | sort -nr | less |
참조
[^1]: Ubuntu Server의 보안을 위해서 해야 할 것들 (Part 1)
[^2]: Ubuntu Server의 보안을 위해서 해야 할 것들 (Part 2)
[^3]: How To Protect SSH with Fail2Ban on Ubuntu 14.04
[^4]: 우분투 방화벽(UFW) 설정
Ubuntu/Debian Basic Security settings
https://blog.thinkbee.kr/2017-04-03-linux-basic-securities-259a0c1129cb/