本文最先发布在:https://www.itcoder.tech/posts/ssh-practice/
SSH 是我们经常要和远程服务器交互使用的工具。
下面是一些实践中总结的 SSH 操作经验:
从安全性和性能上综合考虑,我们建议:
ed25519
,则使用 ed25519
rsa
, 位数选择4096
通过ssh-keygen
工具生成 SSH key。
根据上面的建议,我们推荐你选第一个命令。
如果不支持ed25519
,则使用第二个命令。
ssh-keygen -t ed25519 -C "[email protected]"
ssh-keygen -t rsa -b 4096 -C "[email protected]"
ssh-keygen -t ecdsa -b 521 -C "[email protected]"
ssh-keygen -t dsa -C "[email protected]"
关于密钥密码(passphrase):
在上面创建 SSH key 的时候,如果设置了密码。
那么,以后每次在电脑上使用 SSH 论证的时候,都会提示你输入秘钥密码,非常麻烦。
如果本地电脑安全的话,建议让电脑系统保存 SSH 秘钥密码,避免频繁输入密码。
在~/.ssh
目录下创建config
文件,内容如下:
Host *
UseKeychain yes
AddKeysToAgent yes
使用以下命令(ssh-copy-id
)将 ssh 公钥 拷贝到远程服务器。
以后就可以通过 ssh 公钥密钥来认证登录远程服务器了。
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_ecdsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_dsa.pub [email protected]
请根据 SSH key 加密算法类型,具体选择其中一条命令。 其中, [email protected]
是远程服务器的公网 IP 地址和登录用户名,请根据实际情况修改。
这条命令的作用就是: 将本地 SSH 客户端的公钥,拷贝到远程服务器的~/.ssh/authorized_keys
文件中。
SSH 的默认端口 22,很容易被攻击。
建议将该端口修改为0~65535的非常规端口,比如:3576
编辑 SSH 服务端配置文件:
Port 3576
保存退出。
如果服务器启用了 SELinux,则还需进行额外配置。
首先,确认 SELinux 是否启用:
sestatus 2> /dev/null | grep -E -q 'SELinux status:\s+enabled' && echo yes || echo no
输出 yes 即表示启用了 SELinux,那么就需要再对 SELinux 进行配置:
semanage port -a -t ssh_port_t -p tcp 3576
请注意把 3576
替换为实际配置的端口。
如果服务器启用了防火墙firewalld,则还需进行额外配置。
首先,确认 firewalld 是否启用:
systemctl status firewalld
输出日志中含有Active: active (running)
字样,那么还需要对firewalld进行配置:
firewall-cmd --permanent --zone=public --add-port=3576/tcp
firewall-cmd --reload
(后面对于 SSH 服务端配置文件的修改,最好也需要测试,并重启一下 sshd,保证修改生效。)
测试一下,设置是否正确:
sshd -t
WARNING: 'UsePAM no' is not supported in Fedora and may cause several problems.
根据提示修正错误和警告,直到测试通过。
重启 sshd 服务
systemctl restart sshd
RSAAuthentication yes #是否允许RSA验证
PubkeyAuthentication yes #是否允许公钥验证
AuthorizedKeysFile .ssh/authorized_keys #公钥文件存放的位置
ChallengeResponseAuthentication no #设置是否允许使用提示应答式认证。sshd支持login.conf文件中定义的所有认证类型
PasswordAuthentication no #设置是否需要口令验证,默认为yes
PermitEmptyPasswords no #设置是否允许用空口令登录
UsePAM yes #是否启用PAM插件式认证模块,默认为yes
注:在 RHEL 系列(RHEL,Fedora,CentOS 等)中不允许设置 UsePAM no
,否则可能出现下面的警告和问题。
WARNING: 'UsePAM no' is not supported in Fedora and may cause several problems.
根据实际情况来设置是否允许 root 用户通过 SSH 登录系统。
PermitRootLogin yes #如果为yes则允许root用户使用ssh登录,为no则表示不允许root进行ssh登录,为without-password则表示禁止 root 账户通过密码登入,但仍可以通过公私钥对登入。
AllowUsers aliyun [email protected] # 允许 aliyun 和从 192.168.1.1 登录的 test 帐户通过 SSH 登录系统。
DenyUsers d4rksec aliyun #Linux系统账户 # 拒绝 d4rksec、aliyun 帐户通过 SSH 登录系统
LoginGraceTime 120 #设置如果用户不能成功登录,sshd将会在这个配置参数指定的时间过后断开连接(单位为秒)
MaxAuthTries 6 #指定每个连接最大允许的认证次数。默认值是6.如果失败认证的次数超过这个数值的一半,连接将被强制断开。且会生成额外的失败日志消息。
MaxSessions 10 #指定每个网络连接允许打开会话的最大数目。默认值为10
StrictModes yes #设置sshd在接受登录请求前是否检查用户的主目录以及rhosts文件的权限和所有者等信息。防止目录和文件设成任何人都有写权限
以上配置编辑SSHD 配置文件,/etc/ssh/sshd_config
编辑配置文件:
vi /etc/hosts.allow
sshd:192.168.0.1:allow #允许 192.168.0.1 这个 IP 地址 ssh 登录
sshd:192.168.0.1/24:allow #允许 192.168.0.1/24 这段 IP 地址的用户登录
sshd:ALL # 允许全部的 ssh 登录
编辑配置文件:
vi /etc/hosts.deny
sshd:192.168.0.1:deny #禁止 192.168.0.1 这个 IP 地址 ssh 登录
sshd:192.168.0.1/24:deny #禁止 192.168.0.1/24 这段 IP 地址的用户登录
sshd:ALL # 禁止全部的 ssh 登录
注:同时设置上述两个文件时,hosts.allow文件中规则的优先级更高。
本文不展开,请阅读下面的参考文档,进一步了解相关内容。
如果你有任何疑问,请通过以下方式联系我们:
微信:
微信群: 加上面的微信,备注微信群
QQ: 3217680847
QQ 群: 82695646