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

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

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

SSH 보안을 위한 설정작업 1



보안에 대한 인식이 확산되면서 ssh 사용자가 많이 늘어나고 있다.

 

 

 

그러나 http 대신 https를 사용한다고 해서 보안에 완벽해 지는 것이 아닌 것처럼 telnet 대신 ssh를 사용한다고 해서 보안에 완벽해 지는 것은 결코 아니다.

 

 

 

 

단지 SecureSHellsshtelnet이나 현재는 거의 사용하지 않는 rlogin에 대한 대체로서 몇 가지 부가 기능을 제공하기는 하지만 세션을 암호화함으로써 스니핑에 대비하기 위한 것뿐이다.

 

 

 

 

특히나 ssh 데몬은 root로 가동되고, 통상적으로 root 로그인이 가능하다는 점을 이용해 ssh의 취약성을 이용한 각종 공격이 끊이지 않고 있으므로 ssh의 보안은 매우 중요하다고 할 수 있다.

 

 

 

 

 

ssh는 크게 ssh.com에서 상용으로 제공하는 ssh2와 오픈소스로 제공되는 openssh로 나뉘어져 개발되고 있는데, 실제 두 프로그램 모두 많이 사용되고 있으므로 각각에 대해 알아보도록 하자. 여기에서 openssh에서 제공하는 sshopenssh, ssh.com에서 제공하는 sshssh2로 구분하도록 한다.

 

 

1 openssh의 보안설정

 

openssh는 아래 URL에서 보는 바와 같이 자체적으로 많은 취약성을 가지고 있다.

 

 

 

 

심지어는 일부 버전에서 특정한 ssh 데몬을 띄우는 것만으로 외부에 root 권한을 빼앗길 수도 있는 결함이 있었다.

 

 

 

 

또한 이것 때문에 openssh 백도어 역시 폭넓게 사용되고 있는 것이 사실인데, 이처럼 ssh가 백도어로 자주 사용되는 이유는 다음과 같다.

 

 

 

 

 

미리 지정된 패스워드를 사용하여 root로 로그인 가능하고

각종 로그 파일에 남지 않도록 할 수 있기 때문이며

주로 SSH v1 protocol을 사용하기 때문이다.

 

일단 특정한 sshd가 백도어인지의 여부를 확인하기 위해서는 strings등으로 분석해 보아야 한다.

 

* openssh CVE : http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=openssh

 

따라서 보안을 강화하기 위해 openssh를 사용한 것이 오히려 역효과가 될 수도 있으므로 사용하려면 다음의 두 원칙을 잊지 말아야 한다.

 

 

 

 

 

 

항상 안정한 최신 버전의 프로그램을 사용하여야 한다.

위의 CVE 사이트를 보더라도 openssh는 예전에 심각한 취약성이 존재해 왔다.

 

 

 

 

따라서 항상 최신의 안정버전을 사용하여야 한다.

 

접근 통제 등 보안설정을 엄격히 하여야 한다.

 

 

 

 

 

 

방화벽 등에서 ssh가 사용하는 포트에 대해 엄격히 제한설정하고, ssh 자체 설정 역 시 보안을 고려하여 설정하여야 한다.

 

 

 

 

 

 

7f346f36793bcc87bfb49b416b042257_1675315230_5757.png
 

[그림] openssh 홈페이지

 

그럼, 여기서 openssh의 보안설정을 알아보도록 하자. openssh의 설정 파일은

/etc/ssh/sshd_config인데, 이 설정만 제대로 해도 상당 부분 보안을 강화할 수 있다.

 

 

 

 

 

 

Protocol 2

 

원래 기본 설정은 "Protocol 2,1"로 되어 있는데, 이는 먼저 protocol 2로 접속시도해 보고 실패할 경우 protocol 1로 접속 시도 한다는 의미이다.

 

 

 

 

이는 protocol 1이 지원되므로 권장 사항이 아니다.

 

 

 

 

따라서 위와 같이 1을 지우고, Protocol 2로 설정하는 것이 좋다.

 

 

 

 

 

만약, 12를 함께 제공할 경우에 22번 포트로 telnet 접속하면

“SSH-1.99-OpenSSH_4.x”와 같이 보이게 되고, 위와 같이 2만 제공할 경우에는

“SSH-2.0-OpenSSH_4.x”와 같이 보이게 된다.

 

 

 

 

각자 확인해 보기 바란다.

 

 

 

 

 

현재 protocol 1은 개발이 중단되었고, 치명적이면서 자체적인 취약성이 매우 많으므로 protocol2만을 사용하도록 한다.

 

 

 

 

현재 대부분의 클라이언트 프로그램이 protocol 2를 지원하고 있다.

 

PermitRootLogin no

 

sshopenssh를 사용 시 대부분 root로의 직접 로그인을 허용하고 있다.

 

 

 

 

이러한 경우 무차별 대입법등으로 원격지에서 root로 로그인할 수도 있으므로 root로의 직접 로그인은 가급적 자제하는 것이 좋다.

 

 

 

 

따라서 일반유저로 ssh 로그인한 후 su등을 이용하여 root로 로그인하여야 하는데 굳이 root로의 직접 로그인을 사용하려면 방화벽 등에서 접근통제를 엄격하게 설정하여야 한다.

 

 

 

 

 

 

 

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

 

ssh에서 제공하는 인증에는 공개키 인증과 암호 인증법 이렇게 두 가지가 있는데, 공개키 인증을 사용할 것인지에 대해 설정하는 것이다.

 

 

 

 

공개키 인증 사용 시 공개키가 있어야 하므로 더욱 안전하다.

 

 

 

 

필자는 개인적으로 암호 인증법을 사용하고 있다.

 

RhostsAuthentication no

PasswordAuthentication no

 

.rhost는 보안상 상당히 위험하므로 사용하지 말아야 한다.

 

 

 

 

그리고 일반적인 암호 기반의 인증을 사용할 것인지 결정하여야 하는데, 만약 암호기반의 인증을 제공하려면 엄격하게 접근통제를 하여야 할 것이다.

 

 

 

 

 

 

PermitEmptyPasswords no

 

암호가 없는 계정에 대해 로그인을 허용할 것인지 지정하는 부분이다.

 

 

 

 

당연히 no로 지정하는 것이 좋다.

 

 

 

 

 

 

AllowGroups wheel admin

 

오직 wheel이나 admin 그룹에 속한 유저만 로그인할 수 있도록 허용한다.

 

 

 

 

이외의 그룹에 속한 유저는 암호를 정확히 입력해도 로그인이 거부된다.

 

 

 

 

 

AllowUsers user1 user2

 

위 그룹에 속한 유저 중에서도 user1user2만 로그인을 허용한다.

 

 

 

 

물론 AllowUsers를 별도로 지정하지 않으면 AllowGroups에서 지정한 그룹은 모두 로그인 가능하며 AllowGroups를 지정하지 않고 AllowUsers만 지정하면 그룹에 관계없이 AllowUsers에 지정된 유저만 로그인 가능하다.

 

 

 

 

 

 

ListenAddress 192.168.1.1

 

기본적으로 ListenAddress0.0.0.0으로 되어 있어 인터페이스에 설정된 모든 IP에 대해 리슨(LISTEN)하도록 되어 있다.

 

 

 

 

만약 여러 IPaliasing되어 있다면 꼭 필요한 특정 IP에서만 리슨(LISTEN)하도록 하는 것이 좋다.

 

Port 875

 

ssh의 기본 포트는 22번이지만 반드시 22번으로 사용할 필요는 없으므로 임의의 번호를 할당하여 외부에서 접속할 때에는 “ssh hostname -p 875”와 같이 접속하면 된다.

 

 

 

 

 

만약 여러 포트로 리슨하도록 하려면 아래와 같이 설정하면 된다.

 

Port 22

Port 5002

 

6.2.2 ssh.com ssh2의 보안설정

 

ssh.com에서 제공하는 ssh2는 상용이지만 비상업적 목적인 경우에는 무료로 사용이 가능하다.

 

 

 

 

openssh보다는 보안 취약성이 상대적으로 적으므로 비상업적으로 서버를 운영한다면 openssh대신 ssh.comssh2를 사용하는 것도 고려해 볼 수 있다.

 

 

 

 

그러나 그렇다고 해서 취약성이 전혀 없는 것은 아니므로 가장 최신 버전의 ssh2를 사용하도록 한다.

 

 

 

 

 

ssh2의 취약성은 아래의 URL을 참고하기 바란다.

 

 

 

 

 

http://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=ssh2

 

현재 ssh2의 버전은 아래와 같이 실행하면 확인할 수 있다.

 

 

 

 

 

# ssh -V

ssh: SSH Secure Shell 3.2.9.1 (non-commercial version) on i686-pc-linux-gnu

 

7f346f36793bcc87bfb49b416b042257_1675315260_3376.png
 

[그림] ssh.com 홈페이지

 

그리고, ssh2는 아래 URL에서 다운로드 가능하며 무료라 하더라도 성능상의 제한이나 차이는 존재하지 않는다.

 

 

 

 

 

 

http://ftp.ssh.com/pub/ssh/

 

openssh의 설정파일이 /etc/ssh/sshd_config인데 반해, ssh2의 설정파일은

/etc/ssh2/sshd2_config이지만 제공하는 지시자는 거의 비슷하다.



AllowedAuthentications publickey,password

 

sshd2가 제공하는 인증은 passwordpublickey 그리고 hostbased 방식이 있는데, 기본적으로 publickey,password가 사용된다.

 

 

 

 

이는 순서대로 인증하는 방법을 보여주는데, 먼저 publickey로 인증하고, 두 번째로 password로 인증한다는 의미이다.

 

 

 

 

필자는 주로 password 방식으로 사용한다.

 

DenyUsers devil@192.168.1.3,warez,1337

 

DenyUsers는 접근을 거부할 로컬의 유저를 지정한다.

 

 

 

 

 

위의 경우 192.168.1.3이라는 곳에서 devil 계정으로 ssh 접속 시도하거나, 어떤 IP든 관계없이 warez 또는 uid1337인 계정으로 ssh 접속 시도할 경우 거부하는 설정이다.

 

 

 

 

이외 DenyGroups, AllowGroups, AllowUsers, DenyUsers, DenyGroups 등도 형식이 동일하다.

 

 

 

 

 

AllowHosts 211.47.65.0/24 192.168.1.3

 

로그인을 허가할 IP 또는 IP 대역을 지정한다.

 

 

 

 

여러 개일 경우에는 공란이나 ,로 구분하여 나열하면 되고 도메인 이름일 경우에는 reverse mapping이 제공되어야 한다.

 

 

 

 

마찬가지로 특정 대역의 접근을 제한하려면 DenyHosts를 지정하면 된다.

 

 

 

 

참고로, openssh에서 IP를 제한하려면 tcp wrapper를 이용하여야 한다.



MaxConnections 10

 

동시에 접속을 허용할 횟수를 지정한다.

 

 

 

 

0은 무제한이라는 의미이다.

 

 

 

 

만약 제한된 수를 초과하여 접속시도가 되었을 경우 아래와 같은 로그가 뜨게 된다.



Sep 21 18:21:51 server sshd2[10213]: Refusing connection from "211.xx.xx.xx".

Too many open connections.

 

 

PasswordGuesses 3

 

암호인증 방식으로 인증할 때 최대 몇 차례 시도를 허용할 것인지 지정한다.

 

Ssh1Compatibility no

 

클라이언트가 ssh1만 지원할 경우 ssh1 데몬을 실행할 것인지 여부를 지정한다.

ssh1은 보안상 취약하므로 no로 하는 것이 좋다.

 

 

 

 

 

 

이외 Port, ListenAddress, PermitEmptyPasswords, PermitRootLogin 등은 openssh에서 제공하는 옵션과 동일하거나 유사하다.

 

[ssh2에서 tcp-wrapper 사용하는 방법]

 

ssh2 자체적으로 접근제어 기능을 이용할 수 있지만 만약 tcp-wrapper를 사용하고자 한다면 먼저 이미 설치된 ssh2를 삭제한 후 다음과 같이 재 컴파일하여 설치하도록 한다.

 

 

 

 

 

 

# ./configure --with-libwrap

# make; make install

 

만약 libwrap.a를 찾지 못하면 아래와 같이 파일의 경로를 찾아 경로를 지정해 주면 된다.

 

 

 

 

 

 

# make distclean

# ./configure --with-libwrap=/path_to_libwrap.a/

 

컴파일 및 설치가 완료된 후에는 /etc/hosts.allow/etc/hosts.deny 파일을 아래와 같은 형식으로 설정해 주면 된다.

 

 

 

 

 

 

sshd2 :211.47.65.0/24 192.168.1.1

 

 

흔히 xinetdsshd등의 경우 tcp wrapper를 이용하여 제어가 가능하다는 것을 알고 있는데, bindsendmail 또는 httpd 등도 tcp wrapper설정을 하면 적용이 될까?

대부분 경험적으로 안된다 라고 대답할 것이다.

 

 

 

 

하지만 정확한 대답은 그때그때 달라요가 맞다.

 

 

 

 

왜냐하면 특정한 데몬을 컴파일 시 위와 같이 tcp wrapper 라이브러리인 libwrap을 포함하여 컴파일했는가 하지 않았는가에 따라 좌우되기 때문이다.

따라서 특정한 데몬에서 이를 지원하는지 여부는 다음과 같이 stringsldd로 확인하면 된다.

 

 

 

 

아래에서 sshdxinetdlibwrap이 포함되어 있으므로 tcp wrapper가 작동하고 httpd는 포함되어 있지 않으므로 작동하지 않는다는 것을 알 수 있다.

 

 

 

 

 

 

# strings /usr/sbin/sshd | grep libwrap

libwrap.so.0

libwrap refuse returns

 

# ldd /usr/sbin/xinetd

libwrap.so.0 => /usr/lib/libwrap.so.0 (0xb7f6f000)

 

# ldd /usr/sbin/httpd | grep libwrap

 

 

 

[ssh2 관련 로그 메시지 분석]

 

ssh2를 설치한 후 로그를 모니터링하다 보면 많은 종류의 메시지가 출력되는데, 대표적인 경우 몇 가지에 대해 살펴보도록 하자. 참고로 메시지는 버전에 따라 다소의 차이는 있을 수 있다.

 

 

 

 

 

Sep 21 17:08:47 server sshd2[9448]: password authentication failed. Login to account xxxx not allowed or account non-existent.

 

이는 DenyGroupsDenyUsers에 속하거나 AllowGroups, AllowUsers에 속하지 않는 그룹이나 유저로 접근시도하거나 존재하지 않는 계정으로 접근시도 할 때 남는 로그이다.


 

Sep 21 17:15:51 server sshd2[9580]: password authentication failed. Connection from 211.47.65.57 denied. Authentication as user xxxxx was attempted.

 

AllowHosts에서 허용한 IP 이외의 곳에서 xxxxx라는 유저로 접속시도 했을 때 남는 로그이다.


 

Sep 21 17:46:22 server sshd2[9933]: root login denied for user 'root'.

 

PermitRootLoginno로 설정되어 있을 때 root로 접근시도 할 때 남는 로그이다.


 

Sep 21 17:53:38 server sshd2[10096]: Wrong password given for user 'xxxxx'.

 

xxxxx 계정으로 접근시도 했지만 암호가 틀려 접근이 거부된 경우이다.

 

 

 

관련자료

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

공지사항


뉴스광장


  • 현재 회원수 :  60,017 명
  • 현재 강좌수 :  35,690 개
  • 현재 접속자 :  203 명