黑客蹲端口扫描?SSH 密钥免密 + 四重加固,让暴力破解直接失效。
Linux OpenSSH 服务管理
环境准备
准备两台虚拟机:
- server 虚拟机,并设置ip地址为10.1.8.10/24。
- client 虚拟机,并设置ip地址为 10.1.8.11/24。
设置主机名称和名称解析,以client为例:
# 永久设置主机名[root@localhost ~]# hostnamectl set-hostname client.laoma.cloud# 临时设置[root@localhost ~]# hostname client.laoma.cloud# 验证[root@client ~]# bash# 准备名称解析[root@client ~]# echo "10.1.8.10 server.laoma.cloud server10.1.8.11 client.laoma.cloud client">>/etc/hostsIP地址通过图形化配置(nmtui),过程省略。
OpenSSH 服务介绍
SSH 介绍
SSH 全称是Secure Shell,SSH协议是基于应用层的协议,为远程登录会话和其他网络服务提供安全性的协议。
实现此功能的传统方式,如 telnet (终端仿真协议)、 rcp、ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH 提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。
SSH 建立连接的过程
主要分为下面几个阶段:
- SSH协议版本协商阶段,SSH目前包括SSH1和SSH2两个大版本。
- 密钥和算法协商阶段,SSH支持多种加密算法,双方根据自己和对端支持的算法进行协商,最终决定要使用的算法。
- 认证阶段,服务器和客户端互相进行身份验证。
- 会话请求阶段,客户端会向服务器端发送会话请求。会话请求分为这样几类:申请对数据传送进行压缩、申请伪终端、启动 X11、TCP/IP 端口转发、启动认证代理等。
- 交互会话阶段,会话请求通过后,服务器端和客户端进行信息的交互。例如运行 shell、执行命令、传递文件。
加密类型
- 对称加密,加密和解密都使用一个钥匙。确保数据的完整性、速度快。
- 非对称加密,一对钥匙。公钥用来加密数据。私钥用来解密数据。确保数据的安全性。
双向加密过程
SSH协议是基于非对称加密方法的,服务器和客户端都会生成自己的公钥和私钥。
- 公钥用来加密数据。
- 私钥用来解密数据。
双向加密过程:
- 服务器创建密钥对。远程服务器会在/etc/ssh目录下生成一个名为多个密钥对,例如ecdsa类型的密钥对:ssh_host_ecdsa_key.pub 公钥和 ssh_host_ecdsa_key 私钥。之后每回启动sshd服务的时候,系统会自动在此路径下查找公钥。
客户端请求连接。服务器接到请求后,把公钥传给客户端使用。
- 客户端记录服务器公钥并计算自己的公私钥。客户端将服务器传来的公钥记录在**~/.ssh/known_hosts** 中,若是已经记录有该服务器公钥,则比对是否一致,一致后就计算客户端自己的公私钥。
[xiaoma@client ~10:17:09]$sshserver The authenticity ofhost'server (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:saG2dUIv8FQL+NoWFUtjf0De8wKbzBfqdtSeQ43wqZY. ECDSA key fingerprint is MD5:e4:75:2f:66:d2:cd:42:10:c5:1d:13:56:77:b9:37:bd. Are you sure you want tocontinueconnecting(yes/no)?yes# 作用:# 1. 接收server提供的公钥,使用这个公钥加密数据发送给对方。# 2. 校验对方的公钥是否正确。(如果本地已经提前存储过对方的公钥了)- 客户端使用服务器的公钥加密自己的公钥并发送给服务器。服务器端拥有客户端公钥+自己私钥,客户端拥有服务器公钥+自己私钥,组成了非对称加密系统。
- 双向加解密。服务器发送数据:用客户端公钥加密,客户端收到数据后用自己私钥解密。客户端发送数据:用服务器公钥加密,服务器收到数据后用自己私钥解密。
使用 ssh 访问远端CLI
ssh 工具演示
方式一:只指定IP或主机名
# 通过IP地址[xiaoma@client ~10:35:04]$ssh10.1.8.10 The authenticity ofhost'10.1.8.10 (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:pplZ4EZPQ8M/f7qvKaAffxbf+vKYJg9HCojrmqctkck. Are you sure you want to continue connecting (yes/no/[fingerprint])? `yes` Warning: Permanently added '10.1.8.10' (ECDSA) to the list of known hosts. xiaoma@10.1.8.10's password:`redhat`Activate the web console with: systemctlenable--nowcockpit.socket Last login: Wed Jul2419:25:342024from10.1.8.1[xiaoma@server ~10:36:01]$# 通过主机名称[xiaoma@client ~10:18:56]$sshserver The authenticity ofhost'server (10.1.8.10)'can't be established. ECDSA key fingerprint is SHA256:pplZ4EZPQ8M/f7qvKaAffxbf+vKYJg9HCojrmqctkck. Are you sure you want to continue connecting (yes/no/[fingerprint])? `yes` Warning: Permanently added 'server,10.1.8.10' (ECDSA) to the list of known hosts. xiaoma@server's password:`redhat`Activate the web console with: systemctlenable--nowcockpit.socket Last login: Wed Jul2419:25:342024from10.1.8.1方式二:额外指定用户名
# 指定root用户登录[xiaoma@client ~10:36:31]$sshroot@server# 或者[xiaoma@client ~10:36:59]$ssh-lroot server方式三:额外指定命令
# 同时指定用户和命令[xiaoma@client ~10:37:28]$sshxiaoma@serverhostnamexiaoma@server's password: '123' server.xiaoma.cloud # shell提示符,仍然是本机。 [xiaoma@client ~ 10:38:11]$ [xiaoma@client ~ 10:38:30]$ ssh root@server 'hostname;id' root@server's password:'123'server.xiaoma.clouduid=0(root)gid=0(root)组=0(root)环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023ssh工具配置文件
参考SSH_CONFIG(5)。
[root@client ~]# man ssh_config- ~/.ssh/config,用户自己的配置,优先级高于全局配置。文件权限不得高于644。
- /etc/ssh/ssh_config,全局配置,应用于所有用户。
示例:
# 如果~/.ssh目录不存在,创建该目录[xiaoma@client ~10:47:02]$mkdir-m700.ssh[xiaoma@client ~10:53:51]$vim~/.ssh/config Host * StrictHostKeyChecking no User root PreferredAuthentications Pubkey,password[xiaoma@client ~10:56:10]$chmod600.ssh/config# 清空其他主机秘钥[xiaoma@client ~10:56:42]$>.ssh/known_hosts# 再次登录不会提示主机key是否校验,验证用户也是root[xiaoma@client ~11:05:56]$sshserver Warning: Permanently added'server,10.1.8.10'(ECDSA)to the list of known hosts. root@server's password:参数说明:
- Host*,匹配所有目标服务器。
- StrictHostKeyChecking no,连接目标服务器不校验主机key,直接接受。
- User root,连接目标服务器默认使用laoma账户。
- PreferredAuthentications password,连接目标服务器使用密码认证。
配置文件权限:建议设置为只能用户自己读写。
[laoma@client ~]$sshserver Bad owner or permissions on /home/laoma/.ssh/config[laoma@client ~]$chmod600.ssh/config[laoma@client ~]$sshserver root@server's password:配置 ssh 密钥认证
使用密钥登录,避免输入密码,更安全。
配置过程
# 客户端生成密钥对[xiaoma@client ~11:15:34]$ ssh-keygen Generating public/private rsa key pair.# 私钥保存位置Enterfileinwhichto save the key(/home/xiaoma/.ssh/id_rsa):`回车`# 私钥加密密码,回车表示不加密Enter passphrase(emptyforno passphrase):`回车`# 再次回车Enter same passphrase again:`回车`Your identification has been savedin/home/xiaoma/.ssh/id_rsa. Your public key has been savedin/home/xiaoma/.ssh/id_rsa.pub. The key fingerprint is: SHA256:uVAwRBuKypbnCZFZgJzVLD1bfn9TkY2PFAoRZI4yOXo xiaoma@client.xiaoma.cloud The key's randomart image is: +---[RSA2048]----+|o.+o+o* .*o .oo||.o+o * B +..oo.||+. o @ o...o.||..o o * o...||.=..E S..||.+.....o||o...|||||+----[SHA256]-----+# 查看生成的文件[xiaoma@client ~11:18:29]$ls.ssh/ config id_rsa id_rsa.pub know_hosts known_hosts# 将公钥推动给目标服务器上的目标用户[xiaoma@client ~11:27:26]$ ssh-copy-id xiaoma@server# 验证[xiaoma@client ~11:28:23]$sshxiaoma@serverhostnameserver.xiaoma.cloud# 推送公钥相当于:# 将公钥内容保存到目标服务器上目标用户家目录下.ssh/authorized_keys中[xiaoma@client ~11:28:53]$cat.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2xTgHbtW36OZmRFWXA27YXz+/MkZZqAgmN7ErI+/Cxux7ewTWklc6bk5AZeI4RDgmU2b8WRLwfJhncvQ14Zm0O/EG56Cofr0cCcYiqWc00lMOCtGXbtEQOYpu6qNd5kNmrftQLjotfKZ51XKkpo1mVTDkACdVa8NhgRD9bnf6MQiOboFqY+EkJRGGGFMlkOMXgJjS07EMMc9DmkWuamng/xo/GFX1GNDqCoMZQ/gmhUWSbTCBABMWwroNC6mf7q/p9JbOzcbkQsuMS8HT4NTqC89EoS3FPNrrJ9MlcR1FEqVJZ/Kr6/tcjlkmaqdX5UptMg11aJ2nLxWc5q/MiwWt xiaoma@client.xiaoma.cloud# 在server端查看[xiaoma@server ~11:30:20]$cat.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2xTgHbtW36OZmRFWXA27YXz+/MkZZqAgmN7ErI+/Cxux7ewTWklc6bk5AZeI4RDgmU2b8WRLwfJhncvQ14Zm0O/EG56Cofr0cCcYiqWc00lMOCtGXbtEQOYpu6qNd5kNmrftQLjotfKZ51XKkpo1mVTDkACdVa8NhgRD9bnf6MQiOboFqY+EkJRGGGFMlkOMXgJjS07EMMc9DmkWuamng/xo/GFX1GNDqCoMZQ/gmhUWSbTCBABMWwroNC6mf7q/p9JbOzcbkQsuMS8HT4NTqC89EoS3FPNrrJ9MlcR1FEqVJZ/Kr6/tcjlkmaqdX5UptMg11aJ2nLxWc5q/MiwWt xiaoma@client.xiaoma.cloud# 推给目标主机root用户[root@server ~11:31:02]# mkdir -m 700 .ssh[root@server ~11:31:15]# cp ~xiaoma/.ssh/authorized_keys .ssh# 客户端验证[xiaoma@client ~11:32:25]$sshroot@serverhostnameserver.xiaoma.cloud以非交互方式生成密钥对
[xiaoma@client ~11:34:03]$ ssh-keygen-trsa-N''-fid_rsa_new[xiaoma@client ~11:34:32]$ls*new* id_rsa_new id_rsa_new.pub其他选项
# -i 指定私钥位置[xiaoma@client ~11:34:57]$mv.ssh/id_rsa /tmp[xiaoma@client ~11:35:28]$ssh-i/tmp/id_rsa root@serverhostnameserver.xiaoma.cloud# 如果找不到密钥,则使用密码登录# -p 选项指定目标服务器 sshd 服务端口号,默认22[laoma@client ~]$ssh-lroot-p1022serverhostnameroot@server's password: server.laoma.cloud排故
故障:配置密钥登录后,远程登录仍要需要输入密码验证。
[xiaoma@client ~14:10:49]$ssh'root@10.1.8.10'hostnameroot@10.1.8.10's password:模拟:将目标主机上目标用户的家目录的权限改为777。
[root@server ~14:10:37]# chmod 550 /root处理过程:
- 查看日志
bash# 客户端登录的时候,监控服务端日志 [root@server ~]# tail -f /var/log/secure......Jul3116:13:41 server sshd[3693]: Authentication refused: bad ownership or modesfordirectory /root......发现提示:文件权限有问题。
- 查找文件权限。
[root@server ~]# ls -ld /root drwxrwxrwx. 3 root root 4096 Jul 31 16:09 /root# 更改权限 [root@server ~]# chmod 700 /root加固 SSH 服务
补充:
1.客户端工具修改完配置文件后,下次执行客户端工具,立刻生效。
2.服务器修改完配置文件后,服务程序一直在运行,
配置文件
sshd服务配置文件:/etc/ssh/sshd_config。帮助sshd_config(5)
常见配置:
- PermitRootLogin prohibit-password,禁止root用户通过密码登录。
- PermitRootLogin no,禁止 root 用户登录。
- root用户权限不受限制。
- root用户存在每个linux系统,只需要猜密码就可以。
- 从审计角度来看,很难跟踪哪个授权用户以root身份登录并进行了更改。 如果用户必须以普通用户身份登录并切换到root帐户,则会生成一个日志事件,可用于帮助提供问责制。
- PasswordAuthentication no,禁止用户使用密码登录。
- AllowUsers exampleuser,允许特定用户登录,该用户可以提权为root。
- UseDNS no,客户端连接服务器的时候,服务器不需要反向解析服务端IP地址,提高连接速度。
1. 禁止 root 密码登录
环境准备:提前配置好 root 秘钥登录。
[root@server ~15:32:43]# vim /etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin prohibit-password# 重启服务[root@server ~15:45:54]# systemctl reload sshd连接测试
# 即使使用正确的密码,也无法远程登录[xiaoma@client ~15:29:47]$sshroot@server root@server's password: Permission denied, please try again. root@server's password: Permission denied, please try again. root@server's password: Permission denied(publickey,gssapi-keyex,gssapi-with-mic,password).# 如果配置了秘钥登录,则需要使用选项强制密码认证[xiaoma@client ~15:47:25]$ssh-oPreferredAuthentications=password root@server2. 禁止 root 登录
环境准备:
[root@server ~15:45:54]# vim /etc/ssh/sshd_config#PermitRootLogin yes# 添加一行PermitRootLogin no# 重启服务[root@server ~15:48:14]# systemctl reload sshd连接测试:不管是密码还是秘钥都无法登录
# 即使配置了免密登录,也无法远程登录[xiaoma@client ~15:47:43]$sshroot@server root@server's password: Permission denied, please try again. root@server's password: Permission denied, please try again. root@server's password: Permission denied(publickey,gssapi-keyex,gssapi-with-mic,password).# 但是可以使用普通用户登录,然后提权为root用户[xiaoma@client ~15:48:50]$sshxiaoma@server[xiaoma@server ~15:49:46]$su-[root@server ~15:49:53]#3. 禁止密码登录
环境准备:
[root@server ~15:50:00]# vim /etc/ssh/sshd_config# 注释原有行#PasswordAuthentication yes# 添加新行,设置为noPasswordAuthentication no# 重启服务[root@server ~15:50:46]# systemctl reload sshd连接测试:秘钥可以登录
# laoma账户未配置密钥登录,直接拒绝[xiaoma@client ~15:49:15]$ssh-oPreferredAuthentications=password xiaoma@server Permission denied(publickey,gssapi-keyex,gssapi-with-mic).# 秘钥登录,仍然支持[xiaoma@client ~15:49:15]$sshxiaoma@server Last login: Thu Jul2315:49:152026from10.1.8.114. 只允许特定用户登录
环境准备:laowang用户也可以秘钥登录。
[root@server ~16:24:40]# useradd laowang[root@server ~16:27:42]# echo 123 | passwd --stdin laowang[root@server ~16:27:54]# mkdir -m 700 /home/laowang/.ssh/[root@server ~16:28:18]# cp .ssh/authorized_keys /home/laowang/.ssh/[root@server ~16:28:34]# chown -R laowang:laowang /home/laowang/.ssh/配置sshd服务
[root@server ~16:29:23]# vim /etc/ssh/sshd_config# 最后添加一行AllowUsers xiaoma# 重启服务[root@server ~16:29:47]# systemctl reload sshd测试连接:xiaoma 可以通过秘钥认证登录;laowang不管通过什么方式认证都不可以登录。
[xiaoma@client ~16:30:08]$sshlaowang@serverhostnamePermission denied(publickey,gssapi-keyex,gssapi-with-mic).[xiaoma@client ~16:30:26]$sshxiaoma@serverhostnameserver.xiaoma.cloud