강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

SSH 보안을 위한 설정작업 2편

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

SSH 보안을 위한 설정작업 2

 

 

[ssh2 보안설정]

 

만약 ssh2 데몬을 부팅시에도 자동으로 작동하려고 한다면 /etc/rc.d/rc.local 파일에

/usr/local/sbin/sshd2를 지정해 주면된다.

 

그리고 ssh2 데몬을 22번이 아닌 다른 포트로 띄우려면 설정파일에서 Port 부분을 변경한 후 가동하거나 sshd2 -p 1234”와 같이 직접 띄워도 된다.

 

 

 

 

 

 

ssh2 접근 시도를 할 때 허가된 유저만 접근 가능하다는 경고 메시지를 띄울 수 있다.

설정 파일에 아래와 같이 지정한 경우, 로그인 시도시 아래 경로에서 지정한 파일의 내용이 출력된다.

 

 

 

 

 

 

BannerMessageFile /etc/ssh2/warning.txt

처음 ssh 서버로 접속할 때는 해당 서버의 키를 인증할 것인지 확인하는 절차가 진행되고, 확인 후에는 이 정보를 파일에 저장하여 이후에 동일한 접속일 경우 별도의 확인과정 없이 접속을 하게 된다.

 

 

 

 

그리고 이 키는 $HOME/.ssh2/hostkeys/ 디렉토리(openssh의 경우 $HOME/.ssh/known_hosts)에 생성되는데, 만약 키 값이 변경되었을 경우에는 각각 다음과 같은 경고 메시지가 나오며 접속이 끊기게 된다.

 

 

 

 

이는 session hijacking등을 통한 man in the middle attack을 차단하기 위한 것인데, 만약 서버를 바꾸는 등 정상적일 경우에는 해당 라인이나 파일을 삭제한 후 재접속하여 확인 시 인증을 하면 접속할 수 있다.

 

openssh의 경우)

# ssh 192.168.1.3

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Someone could be eavesdropping on you right now (man-in-the-middle attack)!

It is also possible that the RSA host key has just been changed.

The fingerprint for the RSA key sent by the remote host is

58:2f:1f:e4:a4:cf:64:e6:97:84:c2:01:10:3f:fe:43.

Please contact your system administrator.

Add correct host key in /root/.ssh/known_hosts to get rid of this message.

Offending key in /root/.ssh/known_hosts:6

RSA host key for 192.168.1.3 has changed and you have requested strict checking.

Host key verification failed.

 

ssh2의 경우)

# ssh 192.168.1.3

** !! ILLEGAL HOST KEY FOR check !! **

Remove /root/.ssh2/hostkeys/key_22_192.168.1.3.pub and try again if you think that this is normal.

 

Disconnected; host key not verifiable (Illegal host key.).

 

 

???? [필자경험담]


어떤 관리자와 함께 작업을 하는 중 재미있는(?) 상황을 경험하게 되었다.

 

 

 

 

서버에서 서버로 원격 접속할 때에는 ssh를 이용하여 로그인 하는데, 파일을 전송할 때는 ftp로 접속하는 것이었다.

 

 

 

 

그 관리자에게 혹 scp를 모르냐고 했더니, 그게 뭐냐고 물어보는 것이었다.

 

 

 

 

이렇듯 ssh는 알면서 scp를 모르는 관리자가 있는 것 같은데, 지금과 같이 암호화 전송 프로토콜인 ssh와 비 암호화 전송 프로토콜인 ftp를 함께 사용하는 것은 암호화를 사용하는 의미가 전혀 없게 된다.

 

 

 

 

ssh에서는 암호화를 통한 파일 전송 명령어로 scp를 제공하는데, 사용방법은 아래와 같이 매우 간단한다.

 

 

 

 

아래는 로컬의 /tmp/test.dat 파일을 192.168.1.3/root/ 디렉토리로 암호화된 상태로 복사하는 명령이다.

 

 

 

 

 

 

# scp /tmp/test.dat 192.168.1.3:/root/

root@192.168.1.3's password: xxxxx

Transfering /tmp/test.dat -> 192.168.1.3:/root/test.dat (11k)

|.............................................................................................................................................|

10445 bytes transferred in 0.07 seconds [138.75 kB/sec].

 

만약, 다른 유저 권한으로 복사하려면 user1@192.168.1.3과 같이 사용하면 된다.

 

 

 

ssh 스캔에 대한 대응방법

 

 

처음 리눅스를 설치해서 네트워크를 연결하면 1시간도 되지 않아 서버에 아래와 같은 많은 로그가 쌓이게 된다.

 

 

 

 

바로 외부에서의 ssh 스캔 때문인데, 이 스캔은 수년간 끊이지 않고 지속되고 있는 것이 사실이다.

 

 

 

 

 

 

Feb 28 16:39:06 cofw sshd(pam_unix)[24635]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=192.168.237.254

Feb 28 16:39:09 cofw sshd(pam_unix)[24637]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=192.168.237.254 user=mailnull

Feb 28 16:39:12 cofw sshd(pam_unix)[24639]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=192.168.237.254 user=nfsnobody

Feb 28 16:39:15 cofw sshd(pam_unix)[24641]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=192.168.237.254 user=rpcuser

Feb 28 16:39:18 cofw sshd(pam_unix)[24643]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=192.168.237.254 user=rpc

Feb 28 16:39:21 cofw sshd(pam_unix)[24645]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=192.168.237.254 user=gopher

 

실제 공격코드는 다음과 같이 되어있는데, 암호파일의 사이즈가 날이 갈수록 커져 현재는 수M에 이르는 경우도 있다.

 

 

 

 

 

 

checkauth("test","test",buff);

checkauth("guest","guest",buff);

checkauth(“temp",“temp",buff);

checkauth("admin","admin",buff);

checkauth("user","user",buff);

checkauth("root","password",buff);

checkauth("root","root",buff);

checkauth("root","123456",buff);

checkauth("test","123456",buff);

checkauth("test","12345",buff);

...................................................

 

따라서 아무리 보안설정을 잘 했다 하더라도 쉬운 암호를 사용하는 한명의 유저 때문에 보안문제가 발생할 수 있는 만큼 1장에서 살펴본 john the ripper와 같은 툴을 이용하여 늘 추측이 어려운 암호를 유지하도록 관리하는 것은 쉬운 일이지만 여전히 매우 중요한 문제이다.

 

 

 

 

즉 정리하자면 다음의 방법을 고려해 볼 수 있다.

 

 

 

 

 

 

john the ripper을 이용한 암호 관리

기본 포트를 22에서 875등 임의의 포트로 변경

AllowUsers AllowGroups를 이용한 접근을 허용할 유저/그룹에 대한 접근 제어

tcp wrapperiptables 방화벽을 이용한 접근제어

tcp wrapper는 앞에서 살펴보았고, iptables 이용 시 다음과 같이 실행해 주면 특정한 IP 대역에서만 접근이 가능하게 된다.

 

 

 

 

 

만약 고정IP가 아닌 경우는 다음 장의 내용을 참고하기 바란다.

iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT

iptables -A INPUT -p tcp -s 0/0 --dport 22 -j DROP

계정 잠금 기능을 이용한다.

 

 

 

 

 

계정잠금기능은 원래 윈도우서버에서 제공하는 기능인데, 리눅스에서도 PAM을 이용하여 비슷한 기능을 구현할 수 있다.

 

 

 

 

이 중 PAM에서 제공하는 pam_tally라는 로그인 카운터(tallying) 모듈을 이용하면 되는데, 이 모듈은 접속 시도하는 회수를 모니터링 하다가 성공을 하면 카운터를 리셋하거나 지정된 임계값 이상으로 실패할 경우에는 접근을 차단할 수도 있다.

 

 

 

 

이 모듈은 pam_tally.so 라는 모듈과 카운터 내역을 관리하는 pam_tally라는 실행 파일로 구성되어 있고 로그는 /var/log/faillogbinary 형태로 저장된다.

 

 

 

 

이 기능을 이용하기 위해서는 pam에 추가 설정을 해 주어야 하는데, /etc/pam.d/system-auth 파일에 아래와 같이 추가하면 된다.

 

auth required /lib/security/pam_tally.so no_magic_root

account required /lib/security/pam_tally.so deny=4 no_magic_root reset

 

위의 의미는 5번 누적 접속에 실패할 경우 해당 계정에 대해 lock을 설정하되 (deny=4) root에 대해서는 예외적으로 lock을 설정하지 않겠다는 의미(no_magic_root)이다.

 

 

 

 

또한 허용된 범위 내에서 접속에 성공할 경우에는 접속 실패 회수를 초기화하겠다는 의미(reset)가 되는데, 위와 같이 pam을 설정하면 바로 적용이 된다.

 

 

 

 

 

 

아래의 경우 attacker5라는 계정으로 5회 접속 시도 모두 실패를 한 후 실제암호를 입력했는데도 접속이 되지 않는 것을 보여주고 있다.

 

 

 

# 접속자(클라이언트) 화면

 

Read from remote host cofw: Connection reset by peer

Connection to cofw closed.

 

이때 해당 서버의 로그는 다음과 같이 보이게 된다.

Feb 28 21:05:21 cofw pam_tally[24919]: user attacker5 (509) tally 5, deny 4

 

아래의 명령어를 실행하면 다음과 같이 보이게 된다.

 

 

 

 

 

# pam_tally


User attacker5 (509) has 5

 

만약 잠금을 해제 또는 초기화하려면 다음과 같이 실행하면 된다.

 

 

 

 

 

# pam_tally --user attacker5 --reset


User attacker5 (509) had 5

이후 pam_tally를 실행하면 해당 계정이 사라진 것을 알 수 있다.

 

또는 faillog라는 명령어를 사용해도 되는데, 아래의 경우 최종적으로 접속에 실패한 시각과 어떤 IP에서 시도하였었는지의 정보도 함께 출력되는 것을 알 수 있다.

 

 

 

 

 

 

# faillog


bin 43 0218 04:47:02 +0900 2008 192.75.27.3

daemon 33 0218 04:48:34 +0900 2008 192.75.27.3

adm 106 0218 04:44:19 +0900 2008 192.75.27.3

 

pam_tally 모듈에 대한 좀 더 자세한 정보는

http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_tally.html 을 참고하기 바란다.

암호 인증 방식 대신 키 기반 인증방식을 이용한다.

 

 

 

 

 

리눅스 등 유닉스 계열의 시스템을 운영하다보면 원격지 시스템을 백업하거나 모니터링하기

위해 다양한 스크립트를 이용하기도 한다.

 

 

 

 

이를 위해 자동화된 스크립트를 통해 원격으로

로그인하여 다양한 명령어를 실행하게 되는데, 이렇게 되려면 결국 root등으로 로그인하여

명령어를 실행하여야 한다.

 

 

 

 

대부분 스크립트 내부에 root의 암호를 설정하여 사용하게 되는

, 만에 하나 스크립트가 노출될 경우에는 결국 root 암호가 노출되는 것이 되어 심각한

보안 문제를 유발하게 된다.

 

 

 

 

따라서 편의성뿐만 아니라 보안을 강화하기 위해서라도 기존

의 전통적인 암호 기반의 인증이 아니라 SSH key를 기반으로 한 인증 방법을 고려해 볼

수 있다.

 

 

 

 

대부분 잘 알고 있다시피 SSH는 암호뿐만 아니라 공개키(public key), 개인키

(private key)기반의 인증을 제공하고 있으므로 어렵지 않게 구축할 수 있다.

먼저 클라이언트측 서버에서 ssh-keygen -t rsa를 실행하면 개인키인 id_rsa와 공개키인 id_rsa.pub 파일이 생성된다.

 

 

 

 

그리고 키 생성 과정에서 암호를 입력하라고 나오는데 이때는 암호를 입력하지 않고 그냥 엔터만 연속하여 두 번 입력하도록 한다.

 

 

 

 

그 다음으로 id_rsa.pub 파일을 원격지 서버의 /root/.ssh/ 디렉토리에 authorized_key2라는 파일로 복사하면 이후에는 암호 없이 키로 인증을 하게 된다.

 

 

 

 

물론 이렇게 사용하기 위해서는 ssh 설정파일에서 암호 대신 키로 인증하도록 설정되어 있어야 한다.

 

 

 

 

 

마지막으로 자동화된 차단 프로그램을 이용하는 방법이 있다.

 

 

 

 

워낙 ssh 스캔이 극성이다 보니 다양한 프로그램들이 공개되고 있는데 가장 대표적인 프로그램은 다음과 같다.

 

 

 

 

잘못 설정할 경우 정상 접속도 차단될 수 있으니 주의하여야 한다.

 

- tcp wrapper이용

http://denyhosts.sourceforge.net/

- iptables 이용

http://www.csc.liv.ac.uk/~greg/sshdfilter/

http://www.pettingers.org/code/sshblack.html

 

 

6.2.4 webssh 활용

 

흔히 ssh 서비스를 제공하려고 할 때 불편한 점 중 하나는 바로 puttySecureCrt와 같은 ssh 전용 클라이언트 프로그램을 사용하여야 한다는 점이다.

 

 

 

 

그러나 지금 소개하려는 webssh를 이용하면 별도의 프로그램이 필요 없고 보안도 더욱 강화할 수 있다는 장점이 있는데, 가장 대표적인 프로그램은 mindterm이라는 것으로 java applet으로 구현되어 있으며 http://www.appgate.com/products/80_MindTerm/에서 다운로드할 수 있다.

 

<APPLET CODE="com.mindbright.application.MindTerm.class"

ARCHIVE="mindterm.jar" WIDTH=0 HEIGHT=0>

<PARAM NAME="cabinets" VALUE="mindterm.cab">

<PARAM NAME="sepframe" value="true">

<PARAM NAME="debug" value="true">

</APPLET>

 

소스를 다운로드 및 압축해제 후 위와 같이 html에 추가만 하면 되는데, 이후 브라우저에서 접속하기만 하면 아래와 같은 창이 떠서 프로그램을 실행하게 된다.

 

 

 

 

 

7f346f36793bcc87bfb49b416b042257_1675315372_8625.png
 

[그림] 정상적으로 로그인 된 화면

 

배경색이나 id/pw 저장 등 다양한 옵션을 제공하므로 원하는 대로 설정 가능하고, 또한 apachehtaccess를 이용하면 html 접속 시 사전 인증 후 접속을 허용하도록 설정할 수

도 있다.

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,034 명
  • 현재 강좌수 :  35,787 개
  • 현재 접속자 :  209 명