SSH 서버를 강화하는 방법?


128

SSH 서버 주변의 보안이 절대적으로 불침 투성이되도록하기 위해 어떤 조치를 취해야합니까?

이것은 처음부터 커뮤니티 위키가 될 것이므로 사람들이 서버를 보호하기 위해 무엇을하는지 볼 수 있습니다.


44
절대 불 침투성으로 상자를 꺼야합니다.
Thorbjørn Ravn Andersen

Wake-on-LAN이있는 경우 어떻게합니까?
수수께끼

당신은 WOL 패키지를 보낼 수있는 LAN 내부의 컴퓨터에 접근 할 것이다, 그래서 문제는 ...의 LAN 부분 ... 웨이크 - 온 - 랜 패키지가 전달되지 않는 것
LassePoulsen

키 인증의 경우 암호를 실제로 필요한 암호로 제한 할 수 있습니다.

답변:


108

암호 대신 인증을 위해 공개 / 개인 키 쌍을 사용하십시오.

  1. 서버에 액세스해야하는 모든 컴퓨터에 대해 암호로 보호 된 SSH 키를 생성하십시오.

    ssh-keygen

  2. 허용 된 컴퓨터에서 공개 키 SSH 액세스를 허용하십시오.

    ~/.ssh/id_rsa.pub각 컴퓨터 의 내용을 ~/.ssh/authorized_keys서버 의 개별 라인에 복사 하거나 ssh-copy-id [server IP address]액세스 권한이 부여 된 모든 컴퓨터에서 실행 하십시오 (프롬프트에 서버 암호를 입력해야합니다).

  3. 비밀번호 SSH 액세스를 비활성화하십시오.

    를 열고 /etc/ssh/sshd_config라는 줄을 찾아로 #PasswordAuthentication yes변경합니다 PasswordAuthentication no. SSH 서버 데몬을 다시 시작하여 변경 사항을 적용하십시오 ( sudo service ssh restart).

이제 서버에 SSH를 연결할 수있는 유일한 방법은의 줄과 일치하는 키를 사용하는 것입니다 ~/.ssh/authorized_keys. 이 방법을 사용하여, 나는 그들이 내 암호를 추측하더라도이 거부되기 때문에 무력 공격에 대해 걱정하지 않는다. 오늘날의 기술로 는 공개 / 개인 키 쌍을 무차별 적으로 강제하는 것은 불가능 합니다.


5
-1 : 일반적으로 컴퓨터가 아닌 개인에게 액세스 권한이 부여되므로 서버에 연결하는 각 잠재적 클라이언트 컴퓨터에 대한 키를 만드는 것은 무리가 없습니다. 귀하의 마지막 진술은 귀하의 동의에 따라 정확하지 않으며 클라이언트 시스템에 대한 액세스 / 손상이있는 개인 키에 대한 암호를 설정하지 않기 때문에 SSH 서버에 대한 액세스 권한이 자동으로 부여됩니다. SSH 키 인증이 권장되지만 개인 키는 올바르게 보호되어야하며 설명 된대로 분산 방식이 아닌 개별적으로 사용해야합니다.
João Pinto

7
"일반적으로 컴퓨터가 아닌 개인에게 액세스 권한이 부여되어 서버에 연결하는 각 잠재적 클라이언트 컴퓨터에 대한 키를 만드는 것은 무리가 있습니다"많은 옵션이 있으며 모든 클라이언트에 개인 키를 안전하게 전송하는 방법을 설명하는 것은이 질문의 범위를 벗어난 것으로 보입니다 . 나는 모든 옵션을 제시하지는 않지만 사람들이 이해할 수있는 단순한 옵션을 제시합니다. "... 설명 된대로 분산 방식이 아닌 개별적으로 사용해야합니다."이것은 이전 진술과 모순되는 것으로 보이며 분산 된 것으로 설명하지 않았습니다.
Asa Ayers

5
"불가능"은 아마도 그것을 약간 과장하고있을 것입니다.
Thorbjørn Ravn Andersen

9
이것이 제가 "불가능"하다고 말하는 이유입니다. 이만큼이나 많은 시간이 걸리는 컴퓨터는 아무도 없습니다. "암호화 된 데이터에 대해 키를 테스트 할 수있는 모래 크기의 컴퓨터를 상상해보십시오. 키를 통과하는 데 걸리는 시간에 키를 테스트 할 수 있다고 상상해보십시오. 그런 다음이 컴퓨터의 클러스터를 고려하십시오. 지구를 덮으면 지구 전체를 1 미터 높이까지 덮을 수 있습니다. 컴퓨터 클러스터는 평균 1,000 년 안에 128 비트 키를 해독 할 것입니다. "
Asa Ayers

@ ThorbjørnRavnAndersen "불가능"은 강력한 키를 사용하는 한 실제로 그것을 과장하지 않습니다. 지금은 견적을 찾을 수 없지만 현재 키 길이를 사용하면 "컴퓨터가 물질 이외의 것으로 구성되고 공간 이외의 것을 차지할 때까지 무차별 대입 공격을 실행할 수 없습니다."
Maximillian Laumeister

72

내가 제안 할게:

  • 무차별 강제 로그인 시도를 방지하기 위해 fail2ban 사용

  • SSH를 통한 루트로 로그인 비활성화 이는 공격자가 사용자 이름과 비밀번호를 모두 파악하여 공격을 더욱 어렵게해야한다는 것을 의미합니다.

    에 추가 PermitRootLogin no하십시오 /etc/ssh/sshd_config.

  • 서버에 SSH 할 수있는 사용자를 제한합니다. 그룹 별 또는 특정 사용자 별.

    서버에 SSH를 연결할 수있는 사람을 추가 AllowGroups group1 group2하거나 AllowUsers user1 user2제한합니다.


2
AllowUsersAllowGroups는 쉼표를 허용하지 않는 , 구분자로. 원격으로 시도하지 마십시오. 이 작업을 잘못 수행하여 NAS에서 계속 잠겨 있습니다.
artless noise

4
sshdsshd를 다시 시작하기 전에 항상 구성이 올바른지 확인 하십시오 . 자세한 내용은 이 블로그 를 참조하십시오- sshd -T메인을 다시 시작하기 전에 구성 변경 후 실행하십시오 sshd. 또한 구성을 변경할 때 시스템에서 SSH 세션을 열고 언급 된대로 구성의 유효성을 검증하고 SSH 로그인 테스트를 수행 할 때까지이를 닫지 마십시오.
RichVel

24

다른 답변은 보안을 제공하지만 로그를 더 조용하게 만들고 계정이 잠길 가능성이 적은 방법이 있습니다.

서버를 포트 22에서 다른 서버로 이동하십시오. 게이트웨이 또는 서버에서

보안을 강화하지는 않지만 모든 임의의 인터넷 스캐너가 로그 파일을 복잡하게 만들지 않음을 의미합니다.


1
모호한 보안 ( en.wikipedia.org/wiki/Security_through_obscurity ) 을 믿는 사람들에게는 다른 포트를 사용하는 것이 좋습니다. 그래도 ..
LassePoulsen

32
모호함을 통한 보안은 중요하지 않습니다. 끝없는 무차별 대입 시도의 배경 소음을 줄이는 것입니다. 액세스 실패 로그가 자동화 된 공격으로 가득 찬 경우 유용하게 감사 할 수 없습니다. fail2ban은 공격자 수와 분산 (봇넷) 및 스로틀 공격의 유병률을 감안할 때 볼륨을 충분히 줄이지 않습니다. 특이한 포트에서 ssh를, 당신은 알고 당신이 당신의 상자에 관심있는 실제 공격자에서 온 로그에서 볼 공격. 나는 그것을 강력히 추천합니다.
bobince

웹 연결 ssh 서버에 대해 shodan과 같은 인터넷 서비스를 쿼리하거나 nmap 및 배너 캡처를 사용하면 기본 포트를 거의 무의미하게 변경할 수 있습니다. 나는 이것에 대해 조언 할 것입니다.
SLow Loris

Shodan은 모든 65k 포트를 사용하지 않으므로 높은 포트로 변경하면 스캔에서 제거 될 수 있습니다. 또한 임의의 높은 포트로 이동하면 공격자가 65K TCP 스캔 (매우 시끄러운)을 수행하여 서비스를 공격하기 시작해야합니다. 이 두 가지 모두 보안 측면에서 유리하므로 높은 포트로 이동하는 것이 일반적으로 좋은 계획입니다. 또 다른 하나는 높은 포트로 이동함으로써 당신을 공격하는 사람이 일반적인 배경 인터넷 소음과 달리 시스템을 겨냥하고 있다는 더 나은 아이디어를 얻을 수 있다는 것입니다.
Rоry McCune

23

HOTP 또는 TOTP로 2 단계 인증을 사용하십시오 . 13.10부터 사용할 수 있습니다.

여기에는 다른 답변에서와 같이 비밀번호 인증을 통한 공개 키 인증 사용이 포함되지만 사용자는 자신의 개인 키 외에 두 번째 요소 장치를 보유하고 있음을 증명해야합니다.

요약:

  1. sudo apt-get install libpam-google-authenticator

  2. 각 사용자가 google-authenticator명령을 실행 ~/.google-authenticator하도록하여 2 단계 장치 (예 : Google Authenticator Android 앱) 를 생성 하고 구성하도록합니다.

  3. 편집 /etc/ssh/sshd_config및 설정 :

    ChallengeResponseAuthentication yes
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive
    
  4. 을 (를) sudo service ssh reload변경하려면을 (를) 실행하십시오 /etc/ssh/sshd_config.

  5. 행을 편집 /etc/pam.d/sshd하고 바꾸십시오.

    @include common-auth
    

    와:

    auth required pam_google_authenticator.so
    

다른 구성 옵션에 대한 자세한 내용은 작년의 블로그 게시물입니다 . Ubuntu의 2 단계 ssh 인증 개선 .


21

올바른 로그인 정보 " DenyHØsts " 를 제공하지 못한 sshd 블록 클라이언트 IP 가이 작업을 매우 효과적으로 수행 할 수있게하십시오. 나는 어떤 방식 으로든 대외에서 접근 할 수있는 모든 Linux 상자에 이것을 설치했습니다.

이렇게하면 SSHD에 대한 강제 공격이 효과적이지 않지만 암호를 잊어 버린 경우 자신을 잠그는 방법 (0)을 기억하십시오. 액세스 할 수없는 원격 서버에서 문제가 될 수 있습니다.


2
IP 주소를 금지하기 전에 10 번의 로그인 시도 실패와 같은 옵션이 있습니까?
sayantankhan

20

가장 쉬운 방법은 다음과 같습니다. ufw ( "복잡하지 않은 방화벽")를 설치하고이를 사용하여 들어오는 연결을 제한하십시오.

명령 프롬프트에서 다음을 입력하십시오.

$ sudo ufw limit OpenSSH 

경우 UFW가 설치되어 있지 않은,이 작업을 수행하고 다시 시도 :

$ sudo aptitude install ufw 

많은 공격자가 SSH 서버를 사용하여 암호를 무차별하게 시도합니다. 동일한 IP 주소에서 30 초마다 6 개의 연결 만 허용합니다.


+1 제한을 사용하는 것이 좋습니다. 그러나 내장 sftp 서버를 사용할 때 이것에 대한 연결도 제한하기 때문에 문제가 발생했습니다.
Mark Davidson

2
@Mark-좋은 지적이지만, SFTP 클라이언트가 잘못 작성된 것처럼 들리지 않습니까? 더 많은 SSH 채널을 열 수 있는데 왜 SSH 포트에 계속 다시 연결합니까?
mpontillo

12

추가 보안을 원하거나 회사 네트워크 내부의 SSH 서버에 액세스해야하는 경우 익명 소프트웨어 Tor를 사용하여 숨겨진 서비스 를 설정했습니다 .

  1. Tor를 설치하고 SSH 서버 자체를 설정하십시오.
  2. sshd가에서만 청취하는지 확인하십시오 localhost.
  3. 를 엽니 다 /etc/tor/torrc. HiddenServiceDir /var/lib/tor/ssh및을 설정하십시오 HiddenServicePort 22 127.0.0.1:22.
  4. 을보십시오 var/lib/tor/ssh/hostname. 와 같은 이름이 d6frsudqtx123vxf.onion있습니다. 이것은 숨겨진 서비스의 주소입니다.
  5. $HOME/.ssh/config몇 줄을 열고 추가하십시오.

    Host myhost
    HostName d6frsudqtx123vxf.onion
    ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
    

또한 로컬 호스트에 Tor가 필요합니다. 그것이 설치되어 있으면 들어갈 수 ssh myhost있고 SSH는 Tor를 통해 연결을 엽니 다. 다른 쪽의 SSH 서버는 로컬 호스트에서만 포트를 엽니 다. 따라서 아무도 "일반 인터넷"을 통해 연결할 수 없습니다.


10
고급 모호함에 의한 보안이지만 매우 흥미 롭습니다.
Johannes

8

이 주제에 관한 데비안 관리 기사가 있습니다. 기본적인 SSH 서버 구성과 방화벽 규칙을 다룹니다. SSH 서버를 강화하는 것도 흥미로울 수 있습니다.

문서 : SSH 액세스 보안 유지를 참조하십시오 .


3
조금 늦었지만 질문에 대답 할 때 링크에서 중요한 부분을 복사하여 링크가 쇠약 해지면 정보가 여기에 있도록하십시오.
umop aplsdn

1
좋은 생각. 나는 참여할 시간이 훨씬 적은 기간을 겪고 있지만. 제 답변은 "커뮤니티 위키"이므로 시간이 있으면 언제든지 링크 정보를 추가하십시오.
Huygens

6

SSH 강화에 대한 나의 접근 방식은 ... 복잡합니다. 다음 항목은 네트워크의 가장 가장자리에서 서버 자체에 이르기까지 내가 어떻게하는지에 관한 것입니다.

  1. 차단 목록에 알려진 서비스 스캐너 및 서명이있는 IDS / IPS를 통한 트래픽의 경계 수준 필터링. 내 경계 방화벽을 통해 Snort에서이 작업을 수행합니다 (이 방법은 pfSense 어플라이언스입니다). 때로는 VPS와 같이이 작업을 수행 할 수없는 경우도 있습니다.

  2. SSH 포트의 방화벽 / 네트워크 필터링. 특정 시스템 만 내 SSH 서버에 도달 할 수 있도록 명시 적으로 허용합니다. 이것은 내 네트워크 경계에있는 pfSense 방화벽 또는 명시 적으로 구성되는 각 서버의 방화벽을 통해 수행됩니다. 그래도 내가 할 수없는 경우가 있습니다 (방화벽이 물건을 테스트하는 데 도움이되지 않는 개인 펜 테스트 또는 보안 테스트 랩 환경을 제외하고는 거의 해당되지 않습니다).

  3. 내 pfSense 또는 내부 네트워크를 NAT하고 인터넷과 시스템에서 분리하는 경계 방화벽과 함께 VPN 전용 서버 액세스 . 인터넷에 연결된 포트가 없기 때문에 서버에 접속하기 위해 VPN을 네트워크에 연결해야합니다. 이것은 모든 VPS에서 제대로 작동하지는 않지만 # 2와 함께 해당 서버에 VPN을 연결하여 하나의 VPS를 '게이트웨이'로 설정 한 다음 다른 상자에 IP를 허용 할 수 있습니다. 그런 식으로 VPN이 가능한 하나의 상자 인 SSH를 사용할 수 있거나없는 것을 정확히 알고 있습니다. (또는 pfSense 뒤의 홈 네트워크에서 VPN 연결이며 VPN 액세스가 가능한 유일한 사람입니다).

  4. # 3을 수행 할 수없는 경우 fail2ban4 번의 시도 실패 후 차단하고 1 시간 이상 IP를 차단하도록 구성되어 지속적으로 무차별 공격을하는 사람들에 대한 적절한 보호 기능을 제공합니다. fail2ban을 구성하는 것은 쉽지 않습니다 ...

  5. SSH 포트를 변경하여 포트 난독 화. 그러나이 방법은 추가 보안 조치 없이는 수행하지 않는 것이 좋습니다. "불안을 통한 보안"이라는 용어는 이미 많은 경우에 반박되어 논쟁의 여지가 있습니다. IDS / IPS 및 네트워크 필터링과 함께이 작업을 수행했지만 여전히 자체적으로 수행하는 것은 매우 좋지 않습니다.

  6. Duo Security의 2 단계 인증 솔루션을 통한 필수 2 단계 인증 . 내 SSH 서버 중 하나마다 Duo가 구성되어있어 2FA 프롬프트가 발생하고 각 액세스를 확인해야합니다. (이것은 궁극적으로 유용한 기능입니다. 누군가 암호 문구가 있거나 침입하더라도 Duo PAM 플러그인을 통과 할 수 없기 때문입니다). 이것은 무단 액세스로부터 SSH 서버를 보호하는 가장 큰 보호 기능 중 하나입니다. 각 사용자 로그인은 Duo의 구성된 사용자와 다시 연결되어야하며, 제한적인 세트가 있으므로 시스템에 새 사용자를 등록 할 수 없습니다.

SSH를 보호하기위한 2 센트. 또는 적어도 접근에 대한 나의 생각.


1

Google OTP를 사용하는 대신 RedHat에서 FreeOTP 앱을 체크 아웃 할 수 있습니다. 때로는 앱을 업데이트 할 때 당신을 잠급니다! ;-)

Yubikey, eToken PASS 또는 NG와 같은 다른 하드웨어 토큰을 사용하거나 많은 사용자 또는 많은 서버가있는 경우 오픈 소스 2 단계 인증 백엔드를 사용하고자 할 수 있습니다.

최근 에 이것에 대한 하우투를 썼습니다 .


0

최근 에이 작업을 수행하는 방법에 대한 작은 자습서를 작성했습니다. 기본적으로 PKI를 사용해야하고 튜토리얼에서는 보안을 강화하기 위해 2 단계 인증을 사용하는 방법도 보여줍니다. 그중 아무 것도 사용하지 않더라도 약한 암호 제품군 및 기타 기본 사항을 제거하여 서버를 보호하는 데 약간의 어려움이 있습니다. https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/


0

많은 수의 사용자 / 인증서의 경우 LDAP 통합을 고려하십시오. 대규모 조직은 인증서가 인증 또는 전자 메일 서명에 사용되는지 여부에 관계없이 배지 또는 Fob에 저장된 사용자 자격 증명 및 인증서의 저장소로 LDAP를 사용합니다. 예를 들어 openLDAP, openDJ, Active Directory, Oracle Universal Directory, IBM Directory Server, snareWorks 등이 있습니다.

컴퓨터와 그룹은 중앙 자격 증명 관리를 제공하는 LDAP로 관리 할 수도 있습니다. 그런 식으로 헬프 데스크는 많은 인구를 처리 할 수있는 원 스톱 상점을 가질 수 있습니다.

다음은 centOS 통합에 대한 링크입니다. http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html


0

geoIP 데이터베이스를 사용하여 원산지를 기준으로 차단할 수도 있습니다.

기본적으로 미국에 거주하는 경우 러시아의 누군가가 SSH에 연결해야 할 이유가 없으므로 SSH가 자동으로 차단됩니다.

스크립트는 https://www.axllent.org/docs/view/ssh-geoip/ 에서 찾을 수 있습니다.

iptables 명령을 추가하여 (내 드롭 릿에 한 것) 해당 트래픽의 모든 트래픽을 자동으로 드롭 할 수 있습니다.


1
때때로 GeoIP 데이터베이스가 틀릴 수 있습니다. 어제 모스크바에 있는지 물어 봤습니다. :)
Sean
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.