目标
使用OpenSSH配置远程系统上的安全命令行服务。
关于ssh
首次连接时的公钥交换原理
服务器端的公钥存储在/etc/ssh/ssh_know_hosts 客户端存储公钥于~/.ssh/know_hosts
配置基于ssh秘钥的身份验证
通过配置ssh服务器,可以实现基于秘钥的身份验证而不使用密码。
生成ssh秘钥
要创建用于身份验证的私钥和公钥,请使用ssh-keygen命令。默认情况下,公钥和私钥分别保存在~/.ssh/id_rsa和 ~./ssh/id_rsa.pub文件中。
[root@#test ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:eaz8WpEyQducsB/N5bdGRSVNMF8mojDabT1ay7xJcbk root@#test
The key's randomart image is:
+---[RSA 2048]----+
| = . *=O|
| + X * + B+|
| . = O B +.o|
| * B =.o.|
| S B = Eo |
| . = o o. |
| o . o |
| o |
| ... |
+----[SHA256]-----+
如果未在上述ssh-keygen运行提示时指定密码,那么生成的私钥是不受保护的,任何拥有这个私钥文件的人都可以使用他进行身份验证。而如下所示生成带密码的私钥,则使用密钥进行身份验证时需要输入密钥的密码。
生成带密码的密钥
-f 选项可用来确定保存密钥的文件。在下面的示例中,生成的公钥和密钥分别存放在/home/user/.ssh/key-with-pass /home/user/.ssh/key-with-pass .pub 中。公钥和密钥的权限模式必须为600和644。
[root@#test ~]# ssh-keygen -f .ssh/key-with-pass
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in .ssh/key-with-pass.
Your public key has been saved in .ssh/key-with-pass.pub.
The key fingerprint is:
SHA256:Q6BEyobRzuzizxAqebZahrZRnEhagvONnhBm5Q0NxWI root@#test
The key's randomart image is:
+---[RSA 2048]----+
|.. =B.. |
|.++Eo+ . |
|*B*.o. . |
|=B*o. . |
|o+o+. S |
|o=+. . |
|*=B |
|o*=. |
|.ooo |
+----[SHA256]-----+
[root@#test ~]#
共享公钥
在如上操作生成密钥对之后,在使用基于密钥的身份验证之前,需要将公钥复制到目标系统上
复可以使用 ssh-copy-id 命令,将公钥复制到目标服务器上。在不指定公钥路径的情况下,他会发送/home/user/.ssh/id_rsa.pub文件。也可使用指定路径的公钥。
ssh-copy-id username@remote_server
ssh-copy-id -i .ssh/key-with-pass.pub username@remotehost
公钥将添加到目标服务器上的 ~/.ssh/authorized_keys 文件中。你需要提供目标服务器的用户名(username)和主机名(remotehost)。
执行上述命令后,可能需要输入目标服务器的密码或提供密钥密码(如果设置了密码)。
一旦你的公钥成功复制到目标服务器,你可以使用 SSH 连接进行测试,看是否可以无密码登录到服务器,如下所示:
ssh -i .ssh/key-with-pass username@remotehost
如果一切设置正确,将能够通过 SSH 连接到目标服务器,而无需输入密码。如上所示ssh命令时指定了私钥文件的路径,如不指定,ssh使用默认的/home/user/.ssh/id_rsa文件。
使用ssh-agent进行非交互式身份验证
如果密钥受密语保护,通常情况下必须输入密语才能使用密钥登录。ssh-agent程序可以临时的将密语存储到内存中。之后使用此密钥登录系统之后将无需输入密语。
启动ssh-agent
eval $(ssh-agent)
添加私钥,输入私钥密语
ssh-add #添加默认的私钥
ssh-add .ssh/key-with-pass #添加指定位置私钥,此密钥需要输入密语
注销启动agent的会话,将推出进程,密语被清除。
自定义openssh服务配置
目标
限制直接以root身份登录,并为openssh服务禁用基于密码的身份验证。
openssh由守护进程sshd提供,主配置文件为/etc/ssh/sshd_config。
禁止root使用ssh登录
将/etc/ssh/sshd_config文件中的PermitRootLogin的参数设置为no。设置完后需要重启sshd服务。sysytemctl reload sshd
禁止ssh进行基于密码的身份验证
仅允许基于私钥远程登录
将/etc/ssh/sshd_config文件中的PasswordAuthentication的参数设置为no。设置完后需要重启sshd服务。sysytemctl reload sshd