SSH介绍
SSH(Secure Shell Protocol)在进行数据传输之前先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输,确保传递数据的安全
(1) 利用SSH协议可以有效的防止远程管理过程中的信息泄露问题(如telnet23端口,非加密),协议版本1.x和2.x,2.x更安全
(2) 在默认状态下,SSH服务主要提供两个服务:一是类似telnet的远程联机服务;另一是类似FTP的SFTP服务(借助SSH协议传输数据)
(3) SSH服务由服务端和客户端组成,默认使用22端口
服务端:OpenSSH(openssl),是一个守护进程(daemon),它在后台运行并响应来自客户端的连接请求
客户端:SSH,SecureCRT,Putty,xshell,包含ssh以及像scp(远程拷贝),slogin(远程登录),sftp(安全FTP文件传输)等应用程序
(4) cp本地拷贝;scp全量完整拷贝,效率不高,适合第一次拷贝用;rsync增量拷贝
SSH服务认证类型
基于口令的安全认证
需要知道账号、口令、服务器的IP及开放的SSH端口(此时,联机过程中所有传输的数据都是加密的)
ssh -p 22 [email protected] [command] ;到其他机器执行命令(不会切换)
报错字符串对应的可能问题:
no route to host
可能为防火墙影响
Connection refused
可能为①防火墙影响 ②连接的对端服务没开 ③端口更改
当第一次SSH连接的时候,本地会产生一个密钥文件~/.ssh/known_hosts(多个密钥)
基于秘钥的安全认证
SSH密钥交互式
(1) 客户端创建密钥
用户家目录下的.ssh隐藏目录下会生成:id_rsa(私钥)和id_rsa.pub(公钥)两个文件
[root@nfs01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
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:Dvh1zrD9QNZN6oPqzsyOPA8J0KKsZd8pbLfu/KzoBRE root@nfs01
The key's randomart image is:
+---[RSA 2048]----+
| E |
| . . |
| o o . |
|.. o o . + |
|..o + . S + o . |
|.o o = * X o |
|. = O o * o |
| . B.O . o . |
| .ooOO% . |
+----[SHA256]-----+
(2) 将公钥id_rsa.pub文件复制到想要免密登录的服务器的用户家目录下的.ssh目录
[root@nfs01 ~]# scp ~/.ssh/id_rsa.pub [email protected]:~/.ssh/
(3) 将拷贝过去的id_rsa.pub文件里的内容追加到~/.ssh/authorized_keys文件里
[root@web01 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
(4) 回到本机进行远程SSH连接
[root@nfs01 ~]# ssh [email protected]
Last login: Fri Feb 14 20:48:56 2020 from 192.168.213.1
与基于口令验证的方式相比,基于秘钥的安全认证不需要在网络上传送口令密码,安全性更高
ssh免密钥非交互分发扩展
ssh免交互连接
yum install -y epel-release ;安装epel.repo源
yum install -y sshpass ;安装免交互输入密码的工具
sshpass -p password ssh -o StrictHostKeychecking=no root@ip
ssh密钥对的免交互式分发
ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa
sshpass -p password ssh-copy-id -o StrictHostKeychecking=no root@ip
shell编程:公钥批量分发
更改SSH默认登录配置
一般来说SSH服务使用默认的配置已经能够很好的工作了,如果对安全要求不高,仅仅提供SSH服务的情况,可以不需要修改任何配置,修改配置文件后,需要重启sshd服务才能生效
[root@web01 ~]# awk '/^#Port/||/#PermitRoot/||/PermitEmpty/||/UseDNS/||/^GSSAPIAuthentication/{print NR,$0}' /etc/ssh/sshd_config
17 #Port 22 #修改后ssh登录需要-p指定端口号
38 #PermitRootLogin yes #no被启用,root账户将不能ssh远程登录
64 #PermitEmptyPasswords no #yes被启用,无密码的用户可以远程免密登录
79 GSSAPIAuthentication yes
115 #UseDNS yes ;no被启用,不需要对DNS进行反向解析,可以加快ssh连接速度
修改sshd的默认端口
(1) 检查selinux防火墙策略,添加需要修改的防火墙策略
setenforce 1
yum provides semanage
yum install policycoreutils-python-2.5-33.el7.x86_64
semanage port -l|grep ssh
semanage port -a -t ssh_port_t -p tcp 2222 ;-d移除
(2) 修改sshd的配置文件
Port 2222
(3) 添加firewalld防火墙的规则,放通需要修改的新端口
systemctl start firewalld
firewall-cmd --list-all ; 查看默认防火墙规则
firewall-cmd --permanent --add-port 2222/tcp ;增加开放端口(移除remove)
firewall-cmd --reload ;重新加载防火墙服务
(4) 重新加载sshd服务
systemctl reload sshd
(5) 测试登录
在centos系统里,/var/log/secure文件会有ssh成功登录的日志内容,可用于排查异常登录
sshd基于用户的安全配置
【允许root登录】PermitRootLogin=YES
【允许登录的用户】AllowUser anliu01 anliu02 优先级高
【允许登录的用户组】AllowGroups linux
【不允许登录的用户】DenyUser anliu01
【不允许某个用户在某个ip登录】DenyUser [email protected]
【不允许登录的用户组】DenyGroups linux
sshd基于主机的安全
TCP包装器 /etc/hosts.deny /etc/hosts.allow
或 AllowUsers AllowGroups DenyUsers DnyGroups
SSH公钥批量分发
shell脚本实现100台服务器的公钥的批量分发,LLD规划如下:
100台服务器ip为:192.168.42.101-201
root密码:123456
#远程机器的用户名和密码
password=123456
username=root
#将本机的公钥复制到远程机器的authorized_keys文件中
main(){
sshpass -p $password ssh-copy-id -o StrictHostKeyChecking=no $username@192.168.42.$1 >/dev/null 2>&1
if [ $? -eq 0 ]
then
echo "192.168.42.$1 is successful..."
fi
}
#检查sshpass工具是否安装
basecheck(){
which sshpass >/dev/null 2>&1
if [ $? -ne 0 ]
then
yum install sshpass -y >/dev/null 2>&1
fi
}
#检查网络是否畅通,若通畅则发送ssh公钥
netcheck(){
for j in {101..201}
do
ping -c 1 192.168.42.$j >/dev/null 2>&1
if [ $? -eq 0 ]
then
main $j
else
echo "192.168.42.$j 网络不通畅..."
fi
done
}
basecheck
netcheck