12、登录及安全管理
1 ssh
1.1 ssh基础
ssh [-p port] [user@]hostname
配置文件在/etc/ssh/
文件夹下,ssh_config
是客户端的配置文件,sshd_config
是服务端的配置文件。
密钥文件在账户的家目录下的隐藏文件夹.ssh
中,如root在/root/.ssh/
下。其中有两个文件,authorized_keys
和known_hosts
都是用来存储公钥。
-
authorized_keys
中存储的公钥用于密钥认证,用作其他人登录本机 -
known_hosts
中存储的公钥用于密码认证,用作本机登录其他机器
1.1.1 sshd服务端配置文件
修改服务端默认端口号,配置文件第17行
监听地址,配置文件第19行,默认所有接口地址都开放连接
17 #Port 22
18 #AddressFamily any
19 #ListenAddress 0.0.0.0
20 #ListenAddress ::
如果开启了selinux,需要同步配置selinux配置
semanage port -a -t ssh_port_t -p tcp PORTNUMBER
修改是否允许root账户通过ssh登录,配置文件第38行,默认允许
37 #LoginGraceTime 2m
38 #PermitRootLogin yes
39 #StrictModes yes
40 #MaxAuthTries 6
41 #MaxSessions 10
修改是否允许通过密码来认证,配置文件第65行,默认允许
62 # To disable tunneled clear text passwords, change to no here!
63 #PasswordAuthentication yes
64 #PermitEmptyPasswords no
65 PasswordAuthentication yes
是否开启GSSAPI认证,配置文件第79行,一般用不到建议关闭
78 # GSSAPI options
79 GSSAPIAuthentication yes
80 GSSAPICleanupCredentials no
81 #GSSAPIStrictAcceptorCheck yes
82 #GSSAPIKeyExchange no
83 #GSSAPIEnablek5users no
是否开启反向DNS解析,第115行,建议关闭
114 #ShowPatchLevel no
115 #UseDNS yes
116 #PidFile /var/run/sshd.pid
1.2 ssh登录认证
身份认证采用非对称加密,公钥加密私钥解密,会话使用对称加密。有两种安全认证方式。
1.2.1 口令验证
- 客户端发送登录请求,ssh user@hostname
- 服务器接受请求,将服务器的公钥 ser_rsa.pub 发送给客户端
- 客户端输入密码,密码使用 ser_rsa.pub 加密后发送给服务器(敏感信息安全传输)
- 服务器接受加密后的密码,使用服务器私钥 ser_rsa 解密,匹配认证密码是否合法(如果合法!登录成功)
缺点是可能有中间人攻击,如果有人冒充服务器截获客户端的登录请求,给客户端发自己的公钥,客户端无法识别。
1.2.2 密钥认证
客户端生成一对公钥和私钥,并将自己的公钥储存在服务器上。客户端请求登录的时候,服务器会随机生成一个字符串并用客户端的公钥进行加密,客户端收到之后用自己的私钥解密后,再发回来。服务器收到后进行比对,如果比对成功,就证明用户是可信的,直接允许登录,不再要求密码。从而避免了“中间人”攻击。
ssh免密码登录原理图
相关命令
ssh-keygen
生成公钥和私钥
ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1] [-N new_passphrase] [-C comment] [-f output_keyfile]
生成公钥和私钥,默认在用户目录的.ssh/目录下
[root@node1 ~]$ ssh-keygen -t rsa -P ''
ssh-copy-id
将公钥拷贝到目标主机
ssh-copy-id [-i [identity_file]] [-p port] [user@]hostname
将公钥拷贝到目标主机,目标主机的.ssh/authorized_keys文件中就会有这个公钥的信息
[root@node1 ~]$ ssh-copy-id -i .ssh/id_rsa.pub root@192.168.234.130
ssh-agent bash
将密钥加载到内存中(可选)
ssh-agent bash
客户端有时会出现系统没有将密钥加载到内存中的问题,使用此命令重新加载一遍ssh-agent
1.3 免交互拷贝公钥
1.3.1 使用sshpass免输入密码
1.3.1.1 安装
yum -y install sshpass
1.3.1.2 sshpass -p命令
sshpass -p密码 ssh相关命令
,使用sshpass -p密码
可以免输入密码执行ssh相关的命令
#免输入密码拷贝公钥
#初次拷贝会失败,因为第一次建立ssh连接用用户名密码方式,需要输入确认是否接收对端的公钥
sshpass -p123456 ssh-copy-id -i .ssh/id_rsa.pub root@192.168.234.130
1.3.2 使用StrictHostKeyChecking参数,避免第一次公钥接收的确认
第一次使用ssh-copy-id
拷贝公钥给对端时,首先要建立基于用户名密码方式的连接。建立连接时,对端会将公钥发过来,此时需要输入yes/no确认接收。
使用参数-o StrictHostKeyChecking=no
避免此次确认。
[root@m01 ~]$ ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no root@172.16.1.41
#此时输出中直接来到输入密码环节,跳过了公钥的接收确认
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.16.1.41's password:
1.3.3 完整的免交互拷贝公钥命令
同时使用sshpass
和-o StrictHostKeyChecking=no
参数
sshpass -p123456 ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no root@172.16.1.41
1.4 ssh远程执行命令
使用密钥认证时,可以直接在客户端在服务端上执行命令
ssh ip地址 命令
#显示 172.16.1.41 主机的ip信息
ssh 172.16.1.41 ip a
1.5 批量分发公钥shell脚本
#!/bin/bash
for ip in `cat /tmp/ipaddr.txt`
do
echo "====host $ip start===="
sshpass -p123456 ssh-copy-id -i .ssh/id_rsa.pub -o StrictHostKeyChecking=no root@$ip &> /dev/null
echo "====host $ip done===="
echo ""
done
1.6 批量检查公钥分发是否成功shell脚本
[root@m01 ~]$ vim /server/scripts/check_fenfa_pub_key.sh
#!/bin/bash
CMD=$1
for ip in `cat /tmp/ipaddr.txt`
do
echo "====host $ip check===="
ssh $ip $CMD
echo ""
done
[root@m01 ~]$ /bin/sh /server/scripts/check_fenfa_pub_key.sh hostname
2 w命令
w命令查看用户登录信息,显示信息共分8个部分
1.登录的用户名
2.登录的方式:pts/x
远程登录,tty
本地登录
3.登录的源IP
4.登录时间
5.空闲时间
6.用户消耗CPU的时间
7.用户在操作什么
3 last显示最近的登录信息
reboot system boot 3.10.0-1127.19.1 Sun Oct 4 18:45 - 15:04 (-3:-41)
root pts/1 192.168.234.1 Thu Oct 1 21:00 - crash (2+21:45)
root pts/0 192.168.234.1 Thu Oct 1 19:51 - crash (2+22:54)
reboot system boot 3.10.0-1127.19.1 Fri Oct 2 03:50 - 15:04 (2+11:13)
root pts/0 192.168.234.1 Thu Oct 1 18:54 - crash (08:56)
root pts/0 192.168.234.1 Thu Oct 1 18:43 - 18:54 (00:11)
root tty1 Thu Oct 1 18:38 - 19:49 (01:10)
reboot system boot 3.10.0-1127.19.1 Fri Oct 2 02:37 - 15:04 (2+12:26)
root pts/0 192.168.234.1 Sun Aug 30 14:03 - crash (32+12:34)
reboot system boot 3.10.0-1127.19.1 Sun Aug 30 22:03 - 15:04 (34+17:01)
root pts/0 192.168.234.1 Sun Aug 30 13:45 - down (00:16)
reboot system boot 3.10.0-1127.19.1 Sun Aug 30 13:44 - 14:01 (00:16)
root pts/1 192.168.234.1 Sun Aug 30 13:02 - crash (00:42)
root pts/0 192.168.234.1 Sun Aug 30 12:51 - crash (00:53)
root tty1 Sun Aug 30 20:49 - 13:44 (-7:-4)
reboot system boot 3.10.0-1062.el7. Sun Aug 30 20:49 - 14:01 (-6:-47)
4 lastlog显示所有用户的登录情况
root pts/0 172.16.1.1 Wed Dec 9 10:51:20 +0800 2020
bin **Never logged in**
daemon **Never logged in**
......
mysql **Never logged in**
bigsky pts/0 Wed Dec 9 10:54:36 +0800 2020
5 scp
scp -rp 源文件 [用户@]IP地址:/目标文件
,默认是以当前用户的身份登录目标服务器完成拷贝,如果需要指定用户,需配置[用户@]
部分
#将/etc/yum.repos.d/ 整个拷贝到目标的/tmp/目录下
scp -rp /etc/yum.repos.d/ root@10.0.0.1:/tmp/
参数解释:
-r 递归拷贝
-p 保留文件属性
6 sftp
基于ssh 22端口的ftp工具
命令:
sftp IP地址
连接到对端服务器,进入sftp交互模式
[root@m01 ~]$ sftp 172.16.1.41
Connected to 172.16.1.41.
sftp>
进入sftp模式下的常用命令:
Available commands:
bye Quit sftp
cd path 切换远程ftp服务器目录
get [-afPpRr] remote [local] 下载文件
help 查看全部命令帮助
lcd path 切换本地目录
lls [ls-options [path]] 查看本地目录文件信息
ls [-1afhlnrSt] [path] 查看远程ftp服务器目录文件信息
put [-afPpRr] local [remote] 上传文件
7 htpasswd
生成加密的密码
Usage:
htpasswd [-cimB25dpsDv] [-C cost] [-r rounds] passwordfile username
htpasswd -b[cmB25dpsDv] [-C cost] [-r rounds] passwordfile username password
htpasswd -n[imB25dps] [-C cost] [-r rounds] username
htpasswd -nb[mB25dps] [-C cost] [-r rounds] username password
常用参数:
-c Create a new file.
创建一个密码文件
-b Use the password from the command line rather than prompting for it.
免交互方式输入密码信息
具体用法:
1)交互式生成
[root@web01 password]$ htpasswd -c htpasswd bigsky
New password:
Re-type new password:
Adding password for user bigsky
2)免交互式生成
[root@web01 password]$ htpasswd -bc htpasswd bigsky 123456
Adding password for user bigsky