내부 네트워크(VPN을 통해 로그인)에 서버가 있고 거기에서 OpenSSH 공개/개인 키 인증을 사용하여 SSH를 통해 서버에 로그인합니다. 보안 관점에서 저는 iptables
제가 사용한 세 클라이언트의 MAC 주소를 서버를 통해 바인딩하여 해당 클라이언트만 이를 사용하여 로그인할 수 있도록 하고 싶습니다 .
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
iptables -A INPUT -p tcp --destination-port 22 -j DROP
하지만 이것이 권장됩니까? SSH 로그인을 사용 중인 클라이언트에 연결하기 위해 사용할 수 있는 다른 (더 나은) 방법은 무엇입니까?
(누군가 2FA를 요청하려는 경우 안타깝게도 2FA는 잠재적인 솔루션으로 사용할 수 없습니다.)
감사해요.
답변1
나는 당신이 유효한 사용자 자격 증명을 제공하더라도 SSH 서버가 신뢰할 수 없는 호스트로부터의 연결을 수락하지 못하도록 막고 싶다고 가정합니다. 이 올바른지?
사용자의 공개 키 인증을 선택된 클라이언트 호스트에 연결하는 한 가지 가능한 솔루션은 호스트 기반 인증을 이용하는 것입니다. 호스트 기반 인증을 설정하고 AuthenticationMethods
매개변수를 /etc/ssh/sshd_config
다음과 같이 정의합니다.
AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
또는:
AuthenticationMethods hostbased,publickey
이는 사용자 키나 비밀번호를 확인하기 전에 클라이언트가 연결 중인 호스트에 인증하도록 요청하도록 SSH 데몬에 지시합니다. 전자 옵션은 비밀번호 기반 인증을 허용하는 반면, 후자는 공개 키로 제한됩니다. 호스트 기반 인증은 키 쌍을 기반으로 하기 때문에 SSH 서버는 동적 IP 주소를 사용하여 클라이언트를 인증할 수 있습니다.
전체 지침은 다음과 같습니다. SSH가 호스트 기반 인증을 수행하는 방법은 다음에 문서화되어 있습니다.ssh(1)
매뉴얼 페이지. SSH가 사용자를 식별하는 방법을 확인하고 귀하의 사례에 적합한지 확인하십시오.
호스트 기반 인증은 다음과 같이 작동합니다. 사용자가 로그온한 컴퓨터가 원격 컴퓨터에 나열되어 있는
/etc/hosts.equiv
경우/etc/ssh/shosts.equiv
두 당사자 모두 동일한 사용자 이름을 가지고 있습니다.또는 파일이~/.rhosts
원격~/.shosts
시스템의 사용자 홈 디렉토리에 존재하고클라이언트 컴퓨터의 이름과 해당 컴퓨터의 사용자 이름이 포함된 행을 포함합니다., 사용자는 로그인된 것으로 간주됩니다. 또한 서버는 로그인을 허용하기 전에 클라이언트의 호스트 키를 확인할 수 있어야 합니다. 이 인증 방법은 IP 스푸핑, DNS 스푸핑, 경로 스푸핑으로 인한 보안 허점을 막을 수 있습니다. [관리자 참고사항:/etc/hosts.equiv
,~/.rhosts
및 rlogin/rsh 프로토콜은 일반적으로 본질적으로 안전하지 않으므로 보안이 필요한 경우 비활성화해야 합니다. ]
OpenSSH에서 호스트 기반 인증을 활성화하려면:
- 다음 매개변수 값을 설정하세요.
/etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedAuthentication yes
IgnoreUserKnownHosts yes
IgnoreRhosts yes
# AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
AuthenticationMethods hostbased,publickey
HostbasedUsesNameFromPacketOnly yes
호스트 기반 인증을 수행하기 위해 클라이언트가 제공하는 호스트 이름 정보를 신뢰하도록 설정할 수 있습니다./etc/ssh/sshd_config
:
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly yes
/etc/hosts
또는 네트워크의 DNS 서버에 있는 파일이나 PTR 레코드에 저장된 정보를 사용하여 클라이언트의 IP 주소를 확인함으로써 호스트 이름을 식별하도록 SSH 데몬을 구성할 수 있습니다 .
# /etc/ssh/sshd_config
HostbasedUsesNameFromPacketOnly no
UseDNS yes
/etc/ssh/shosts.equiv
파일에 승인된 클라이언트의 호스트 이름을 나열합니다. 존재하지 않는 경우 수동으로 생성하십시오. 이 파일의 구문은 다음에 설명된 구문과 거의 동일합니다.인간호스트.equiv(5), 하지만SSH 데몬은 빈 호스트 이름을 허용하지 않습니다..
# /etc/ssh/shosts.equiv
ssh-client-alpha
ssh-client-bravo
ssh-client-charlie
/etc/ssh/ssh_known_hosts
파일에 승인된 호스트의 공개 키를 나열합니다. 편리한 방법은 통과하는 것입니다ssh-keyscan
:
[root@ssh-server ~]# ssh-keyscan ssh-client-alpha >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-bravo >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-charlie >> /etc/ssh/ssh_known_hosts
호스트 기반 인증 요청을 수락하도록 OpenSSH 서버를 구성한 후에는 호스트 기반 인증을 요청하도록 클라이언트도 구성해야 합니다.
- 다음 매개변수 값을 설정하세요.
/etc/ssh/ssh_config
:
# /etc/ssh/ssh_config
Host *
HostbasedAuthentication yes
EnableSSHKeySign yes
- SUID/SGID 비트를 확인하세요.
ssh-keysign
실행 파일은 호스트의 개인 키 파일에 대한 읽기 권한을 부여합니다.
[root@ssh-client-alpha ~]# find /usr -name ssh-keysign -ls
16517300 616 -r-xr-sr-x 1 root ssh_keys 630344 Feb 4 16:01 /usr/libexec/openssh/ssh-keysign
[root@ssh-client-alpha ~]# ls -l /etc/ssh/ssh_host_*key
-rw-r----- 1 root ssh_keys 480 Apr 13 06:51 /etc/ssh/ssh_host_ecdsa_key
-rw-r----- 1 root ssh_keys 387 Apr 13 06:51 /etc/ssh/ssh_host_ed25519_key
-rw-r----- 1 root ssh_keys 2578 Apr 13 06:51 /etc/ssh/ssh_host_rsa_key