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

Share

Last Updated on 4월 14, 2024 by Jade(정현호)

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 관련된 내용은 아래에 있습니다.


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

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 설치 

[root]# unzip denyhosts-2.10.zip
[root]# cd denyhosts-2.10

[root]# python setup.py install


설정 파일 확인 및 수정

[root]#  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 데몬파일 생성

[root]# cd /usr/bin

[root]# cp daemon-control-dist daemon-control
[root]# chown root:root daemon-control
[root]# chmod 700 daemon-control


denyhosts 데몬파일 수정

[root]# 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이 비밀번호 대입공격에 대해서는 효과적인 보안이 설정 된 것 같습니다.

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

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

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


연관된 다른 글

 

 

 

    

1
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x