SSH 키 방식 설정- SSH 보안 설정 - Brute force(무작위 대입)공격을 denyhosts 이용한 보안 설정

Last Updated on 12월 27, 2020 by 태랑(정현호)


2020.10.17 : 내용 전체 최신화(수정)


ssh 설정 변경



이번에는 ssh 애기를 해보려 합니다



예전에 학과 서버를 centos로 마이그레이션 하면서 vsftpd로 ftp, ssh, HTTP 80포트를 임시적으로 오픈 하였던 시기가 있었습니다.


사이트 와 서버 구성중에는 80포트을 열어놓고 테스트 페이지만 띄워 놓았다가 구성이 완료 된 후  ssh 를 오픈 하였고 2-3 일 후 매일 4시에 로그를 분석해서 리포트를 해주는 logwatch 가 보내온 메일을 보고 깜짝 놀랄수 밖에 없었습니다


ftp는 물론이고 ssh로 Brute force공격(무작위 사전 아이디 대입공격)을 시도한 로그가 상당히 많았습니다.
ip대역대는 대부분이 외국이었고 새벽시간때 엄청 많은 접속 시도 내역을 확인 하게 되었습니다.


root 계정에 대해서는 ssh 및 ftp접속이 되지 않도록 설정하여 안심하고 있었지만 생각지도 못한 DB 계정이나 몇개의 계정 에도 대입을 시도한 흔적을 확인하였습니다.
있을만한 수 많은 아이디로의 접속 시도 였습니다.


서버 오픈 초기라 대응되는 아이디가 거의 없었지만 무신경하게 보았던 logwatch 가 보내준 리포트를 살펴보니 그날 만이 아닌 그전날도 그전날도 계속 공격의 흔적을 확인 할 수 있었습니다.

그래서 ssh의 설정을 통해 조금 더 보안을 강화 해보기로 하였습니다.

* denyhosts 관련된 내용은 아래에 있습니다.






ssh 설정 관련



먼저 ssh 관련 옵션에 대해서 확인해보겠습니다.
일단 /etc/ssh/sshd_config 을 열어서 몇가지를 살펴보죠


#Protocol 2,1

=> Protocol 2 
ssh 1 과 2 중 2.0만 사용하겠다라는 의미 입니다.
1.0 버전이 취약하며 공격자는 중간자 공격으로 SSH Downgrade Attack 할 수 있으므로 반드시 2.0만 사용하도록 sshd_config 설정을 해야 합니다



#LoginGraceTime 2m

=>LoginGraceTime 60

해석을 해보면 "로그인 허용 시간" 정도가 되겠는되요

주석을 풀고 60을 써주면 60초 만 허용하겠다 라는 의미로써 
시간은 짧은 수록좋을 것 같습니다



#PermitRootLogin yes

=>PermitRootLogin no
root 계정의 접속을 허용치 않겠다 라는 것입니다
yes는 접속허용한다는것임으로 no 로 설정 하시면 됩니다.



주석에는 없지만 쓸수있는 옵션으로 아래와 같은 옵션이 있습니다.

AllowGroups
AllowUsers
DenyGoups
DenyUsers




저같은경우 유저 들을 특정 그룹하나로 묶고 해당 그룹만 접속이 가능하도록 아래와 같이 설정하였습니다.

예를들어 OS 계정의 그룹을 member 라고 설정 하였다면 아래와 같이 설정할 수 있습니다.


AllowGroups member

DenyGroups root



위와 같이 구성 시 member 그룹에 속한 일반계정만 접속이 가능하게 됩니다.



또한 AllowUsers root@192.168.0.25  와 같이 IP까지 접속 가능/불가 정책의
기준으로 내용을 넣을 수도 있습니다.


정리하면 root 계정의 로그인 차단/거부와 AllowGroups를 이용하여
실제사용하는 유저들만 접속 가능하게 설정한다는 내용입니다.





ssh key 인증방식으로 설정



예전에는 패스워드 방식으로 ssh을 통해 시스템에 접속하지만 요즘은 클라우드 나 VPS 를 접속할 때에는 공개키/비밀키(개인키)를 이용한, 키 방식으로 접속하는 환경으로 서비스가 제공되고 있습니다.


패스워드 기반의 경우 아래에서 설명할 brute-force 공격이나 알기 쉬운 비밀번호 등에 의해 ssh의 보안이 약해질 수도 있습니다.


키 방식은 접속시 키를 소지하고 있지 않는다면 접속 할수 없게 되기 때문에 brute-force 공격이나 유추하기 쉬운 비밀번호 에 의해 접속이 되는걸 방지 할 수 있습니다.


또한 키 방식으로 사용하면 접속시 마다 비밀번호를 입력하지 않고 접속 할 수 있기 때문에 편리한 점도 있습니다.





# 서버 상에서의 sshd_config  설정


키 방식 ssh을 사용하려면 패스워드 인증방식을 off 하고 오직 키 방식으로만 사용하는 것이 좋습니다.



[root]# vi /etc/ssh/sshd_config

PasswordAuthentication no  <-- no 로 설정함
  -> password 인증을 비활성화 함으로써 키 인증으로만 사용


인증 정보 파일 확인 및 추가
AuthorizedKeysFile .ssh/authorized_keys

기본값인 authorized_keys 파일을 사용하면 됩니다.




이제 접속을 허용 하고자 하는 유저에서 키를 생성합니다.


[root]# su - testuser

[testuser]$


[testuser]$ ssh-keygen -t rsa -b 4096  
   =>  [물어보는 항목에서는 모두 엔터 를 입력합니다]


[testuser]$ cd .ssh
[testuser]$ ls -al




.ssh 디렉토리에 id.rsa(개인,비밀키) 와 id.rsa.pub(공개키)  2개가 생성 됩니다.
authorized_keys 파일에 공개키 내용을 추가 합니다.

[testuser]$ cat id.rsa.pub >> authorized_keys


authorized_keys 파일은 600이나 400 이어야 합니다.
[testuser]$ chmod 600 authorized_keys



id.rsa 파일을 PC로 다운받아서 접속이 되는지 충분히 테스트를 진행 합니다.


키를 통하여 접속이 충분히 테스트 되었다면 개인키로만 접속 할 수 있도록 sshd 를 재시작 하여 변경 사항을 적용 합니다

[root]# systemctl restart sshd



서버에서 openssl 로 생성 한 키를 이용한 여러 사용 법에 대해서는 아래 포스트를 확인 하시면 됩니다.





Denyhosts 구성



DenyHosts는 Python으로 작성된 SSH 서버를 위한 로그 기반 침입 방지 보안 도구입니다.


SSH 인증 로그에서 잘못된 로그인 시도를 모니터링하고 설정된 정책에 따라 IP 주소를 차단하여 SSH 서버에 대한 무차별 대입 공격을 방지하게 됩니다.




# 파일 다운로드

wget  https://netix.dl.sourceforge.net/project
/denyhosts/denyhosts/2.10/denyhosts-2.10.zip
-->  모바일을 위해서 개행되어 있습니다.
-->  실제로 사용시 한줄로 수행해야 합니다.




# denyhosts 설치 
unzip denyhosts-2.10.zip
cd denyhosts-2.10

python setup.py install





# 설정 파일 확인 및 수정
#  vi /etc/denyhosts.conf
SECURE_LOG = /var/log/secure
fedora와 centos ,rhel 은 보안관련 로그는 /var/log/secure에 저장됩니다.

그밑에 주석되어있는부분보면 BSD, mandrake등에 맞는 설정이있지만

주석되어있다는것 확인 하고 다른 옵션을 살펴 보도록 하겠습니다.


HOSTS_DENY = /etc/hosts.deny

라고 기본이 되어있는데 이렇게 되어있다면 공격이 감지되면

바로 hosts.deny 에 기록되며


/etc/hosts.block 으로 설정한다면
/etc/hosts.deny 파일에 ALL: /etc/hosts.block 형식으로 기록이 되게 됩니다.
하여 별도로 block 이 뒤에 붙은 아이피를 따로 차단하거나 관리를 할 수 있습니다.
저는  hosts.deny 사용 했습니다


PURGE_DENY = 
위의 주석에 보면 예문이 많이 나오는데 차단된
IP 을 다시 놓아줄 기간을 설정 하라는 내용인데 
저는 reset 시키지 않으려고 공백으로 설정 하였습니다.



BLOCK_SERVICE =
차단을 할 서비스를 선택 하는 옵션입니다.
ssh를 할지 vsftpd를 할지를 결정하는것인데요

전 ALL 로 설정 하였습니다.


DENY_THRESHOLD_INVALID =
몇번 로그인실패시 차단시킬 한계점을 정하라는건데요

전 3으로 했습니다

This value applies to invalid user login attempts
"이 값은 유효하지 않은 사용자가 로그인 시도에 적용"

라고 써있고 밑에는 non-existent user accounts 라고 되어있는데요

등록되지않은 유효하지 않은 아이디로 로그인 시도시 몇번까지
봐줄거냐 정도의 내용이 되겠습니다


DENY_THRESHOLD_VALID =
이건 user accounts that exist in /etc/passwd 라고 기재되어 있습니다.
존재 하는 유저로 로그인 시도시 실패는 몇번까지 허용할것인지를
설정하는 옵션으로 저는 5  로 설정하였습니다.


DENY_THRESHOLD_ROOT =
root 유저 의 접속 실패 한계횟수를 지정하는 것으로 전 2 로 설정 하였습니다.


DENY_THRESHOLD_RESTRICTED =

WORK_DIR/restricted-usernames 파일에 설정된 username 에 대해서
접속 실패시 차단 정책으로 기본값은 1회 입니다.
WORK_DIR 경로는 /var/lib/denyhosts (다를 수 있음)


ADMIN_EMAIL =

불법 침입 시도를 감지하여 차단 하였을때 받을 메일 주소 입니다.
root@localhost  라고 해주면 root가 받을수있습니다

참고로 수신된 메일은 [root]# mail  명령어를 통해 확인 할 수 있습니다.


DAEMON_LOG =

denyhosts 의 로그를 기록할 위치및 파일명을 기술해면 됩니다


DAEMON_SLEEP = 30s

secure 파일에서 pooling 해오는 주기
즉 30초마다 secure 파일을 참조하여 조건에 맞는 , 차단할 IP를 등록 하게 됩니다.
30초마다 데몬이 /var/log/secure 파일을 체크 한다는 의미입니다.






# denyhosts 데몬파일 생성

cd /usr/bin
cp daemon-control-dist daemon-control
chown root:root daemon-control
chmod 700 daemon-control





# denyhosts 데몬파일 수정
vi daemon-control

아래와 같은지 확인합니다.

DENYHOSTS_BIN   = "/usr/bin/denyhosts.py"
DENYHOSTS_LOCK  = "/var/run/denyhosts.pid"
DENYHOSTS_CFG   = "/etc/denyhosts.conf"






## 서비스에 등록


# Linux 7(Centos 기준)
[root]# cd /etc/init.d
[root]# ln -s /usr/bin/daemon-control denyhosts

[root]# systemctl enable denyhosts
[root]# systemctl daemon-reload



# Linux 6(Centos 기준)
[root]# cd /etc/init.d
[root]# ln -s /usr/share/daenyhosts/daemon-control denyhosts
[root]# chkconfig --add denyhosts







# 서비스를 시작
# systemctl start denyhosts
# systemctl status denyhosts




시작 후 확인 해보면 /etc/hosts.deny 파일에 정책을 위반한 ip 들이 기록되고
있을 것  입니다.




** 등록된 IP 를 삭제(위치는 최신버전에서 아직 확인 되지 않음) **
denyhosts 를 중지하고( service denyhosts stop)
아래 파일에서 IP를 삭제 한 후 재기동

/var/lib/denyhosts/hosts

/var/lib/denyhosts/hosts-restricted
/var/lib/denyhosts/hosts-root
/var/lib/denyhosts/hosts-valid
/var/lib/denyhosts/users-hosts
/etc/hosts.deny





conclusion



이렇게 ssh 보안을 설정 및 denyhosts 와 같은 보안툴을 통해 ssh이 비밀번호 대입공격에 대해서는 효과적인  보안이 설정 된것 같습니다.



중요한점은 불필요한 계정(test계정)등은 생성치않고 1회성(설치에 필요한 유저) 계정은 작업 완료 후  passwd -l   로 계정을 잠금 하고 비밀번호는 최대한 길게 설정하는 것 입니다.



또한 SSH 접속은 비밀번호 방식 대신 SSH-Key 방식의 사용을 더 적극적으로 사용할 필요성이 있습니다.



그리고 logwatch 등을 이용하여 일주일에 1-2번정도 보안 로그를 학인 해보시면 더 좋을것 같습니다






연관된 다른 글


답글 남기기