前言
大多数企业服务器是通过远程登录的方式来进行管理的
当需要从一个工作站管理数以百计的服务器主机时,远程维护的方式将更占优势
一:SSH远程管理
1.1:配置Open SSH服务端
1.1.1:SSH协议
为客户机提供安全的shell环境,用于远程管理
默认端口:TCP 22
1.1.2:OpenSSH服务–1
服务名称:sshd
服务端主程序:/usr/sbin/sshd
服务端配置文件:/etc/ssh/sshd_config
ssh_config:针对客户端
sshd_config:针对服务端
1.1.3:OpenSSH服务–2
-
服务器监听项
端口号,协议版本,监听地址
禁用反向解析
[root@test01 opt]# vim /etc/ssh/sshd_config #Port 22 #监听端口号22,可以修改 #ListenAddress 0.0.0.0 #ipv4监听地址,可以修改 #ListenAddress :: #ipv6监听低,可以修改 ... #UseDNS no #禁用反向解析 ....
-
用户登录控制
禁用root用户,空密码用户
限制登录验证时间,重试次数
AllowUsers,DenyUsers
[root@test01 opt]# vim /etc/ssh/sshd_config LoginGraceTime 2m #会话超时时间两分钟 PermitRootLogin no #不允许root远程登录 MaxAuthTries 6 #允许最大的验证次数 MaxSessions 10 #允许最大的会话次数 PermitEmptyPasswords no #不允许空密码远程登录 AllowUsers lisi admin@192.168.20.30 '仅允许lisi用户在所有终端登录,仅允许admin用户通过地址192.168.20.30远程登录 ...
[root@test01 opt]# vim /etc/ssh/sshd_config .... PermitRootLogin no [root@test01 opt]# systemctl reload sshd [root@test02 ~]# ssh root@192.168.100.110 #远程以root身份登录 The authenticity of host '192.168.100.110 (192.168.100.110)' can't be established. ECDSA key fingerprint is SHA256:z9DjPlPWqhHOp4AsbDxOiSb4w86EvV9018/iUUHE1NM. ECDSA key fingerprint is MD5:e5:d9:66:a5:4e:2f:fe:86:06:ef:cc:2f:09:4c:40:a7. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.100.110' (ECDSA) to the list of known hosts. root@192.168.100.110's password: Permission denied, please try again. #访问拒绝
但是这里有个问题,用户可以通过su root远程登录root用户
[root@test01 opt]# useradd wangwu [root@test01 opt]# passwd wangwu 更改用户 wangwu 的密码 。 新的 密码: 无效的密码: 密码少于 8 个字符 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。 [root@test02 ~]# ssh wangwu@192.168.100.110 wangwu@192.168.100.110's password: Last login: Wed Jul 8 20:07:59 2020 from 192.168.100.120 [wangwu@test02 ~]$ su - root 密码: 上一次登录:三 7月 8 20:08:09 CST 2020pts/1 上 最后一次失败的登录:三 7月 8 20:08:24 CST 2020从 test01ssh:notty 上 最有一次成功登录后有 1 次失败的登录尝试。 [root@test01 ~]# #这里已经登录到test01主服务器的root用户
解决方法,增加pam远程su 认证
[root@test01 opt]# vim /etc/pam.d/su 1 #%PAM-1.0 2 auth sufficient pam_rootok.so 3 # Uncomment the following line to implicitly trust users in the "wheel" group. 4 #auth sufficient pam_wheel.so trust use_uid 5 # Uncomment the following line to require a user to be in the "wheel" group. 6 auth required pam_wheel.so use_uid #取消注释 [root@test01 ~]# gpasswd -a lpf wheel 正在将用户“lpf”加入到“wheel”组中
[root@test01 ~]# id lpf
uid=1000(lpf) gid=1000(lpf) 组=1000(lpf),10(wheel)
[root@test01 ~]# id wangwu
uid=1001(wangwu) gid=1001(wangwu) 组=1001(wangwu)
[root@test01 ~] /etc/pam.d/su
auth required pam_wheel.so use_uid
##开启pam.d认证 允许lpf wheel组允许su切换用户
[root@test02 ~]# ssh lpf@192.168.100.110
lpf@192.168.100.110's password:
Last failed login: Wed Jul 8 22:56:39 CST 2020 on pts/1
There was 1 failed login attempt since the last successful login.
Last login: Wed Jul 8 18:48:13 2020
[lpf@test01 ~]$ su - root
密码:
上一次登录:三 7月 8 22:49:24 CST 2020从 192.168.100.1pts/0 上
最后一次失败的登录:三 7月 8 22:55:59 CST 2020pts/1 上
最有一次成功登录后有 1 次失败的登录尝试。
[root@test01 ~]# exit
登出
[lpf@test01 ~]$su - wangwu
密码:
上一次登录:三 7月 8 22:55:40 CST 2020从 192.168.100.120pts/1 上
[wangwu@test01 ~]$ su - root
密码:
su: 拒绝权限
[wangwu@test01 ~]$ su - lpf
密码:
su: 拒绝权限
[wangwu@test01 ~]$
验证最大登录次数
[root@test01 ~]# vim /etc/ssh/sshd_config
MaxAuthTries 6
[root@test02 ~]# ssh lpf@192.168.100.110
lpf@192.168.100.110's password:
Permission denied, please try again.
lpf@192.168.100.110's password:
Permission denied, please try again.
lpf@192.168.100.110's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
#此时从服务器尝试登陆三次失败就拒绝了,那么6是怎么生效的呢
#设置能够连接次数为8,输入错误密码,连接可以尝试8次,但是到尝试登录6次后拒绝,尝试登录次数生效。
[root@test02 ~]# ssh -o NumberOfPasswordPrompts=8 lpf@192.168.100.110
lpf@192.168.100.110's password:
Permission denied, please try again.
lpf@192.168.100.110's password:
Permission denied, please try again.
lpf@192.168.100.110's password:
Permission denied, please try again.
lpf@192.168.100.110's password:
Permission denied, please try again.
lpf@192.168.100.110's password:
Permission denied, please try again.
lpf@192.168.100.110's password:
Received disconnect from 192.168.100.110 port 22:2: Too many authentication failures
Authentication failed.
1.1.4:OpenSSH服务–3
-
用户登录控制
禁止root用户,空密码用户
登录时间,重试次数
AllowUsers(白名单,仅允许,只有这些可以登录)
DenyUsers(黑名单,仅拒绝,只有这些不行)
AllowUsers不可与DenyUsers同时使用
[root@test01 ~]# vim /etc/ssh/sshd_config
LoginGraceTime 2m
PermitRootLogin yes
StrictModes yes
MaxAuthTries 6
MaxSessions 10
...
AllowUsers lpf wangwu@192.168.100.120 '仅允许wangwu用户在终端192.168.100.120登录';仅允许lpf用户通过任意终端登录
#验证白名单
[root@test01 ~]# vim /etc/ssh/sshd_config
.....添加
AllowUsers lpf wangwu@192.168.100.130
[root@test01 ~]# systemctl reload sshd
[root@test02 ~]# ssh lpf@192.168.100.110
lpf@192.168.100.110's password:
Last failed login: Wed Jul 8 23:30:40 CST 2020 from 192.168.100.120 on ssh:notty
There were 6 failed login attempts since the last successful login.
Last login: Wed Jul 8 23:28:55 2020 from 192.168.100.120
[lpf@test01 ~]$ exit
登出
Connection to 192.168.100.110 closed.
[root@test02 ~]# ssh wangwu@192.168.100.110
wangwu@192.168.100.110's password:
Permission denied, please try again.
1.1.5:OpenSSH服务–4
-
登录验证对象
-
服务器中的本地用户账号
-
登录验证方式
-
密码验证:核对用户名,密码是否匹配
-
密钥对验证:核对客户的私钥,服务端公钥是否匹配
-
密钥对:包含公钥,私钥
-
公钥:服务器使用
-
私钥:客户保留
-
非对称秘钥:RSA
-
对称秘钥:3DES,AES
[root@test01 ~]# vim /etc/ssh/sshd_config
PasswordAuthentication yes '是否使用密码'
PermitEmptyPasswords no '禁止空密码'
PasswordAuthentication yes '是否需要密码验证'
PubkeyAuthentication yes '开启公钥验证'
AuthorizedKeysFile .ssh/authorized_keys '指定公钥库位置';默认存放在所在家目录,这里是隐藏文件
1.2:使用SSH客户端程序
1.2.1:SSH客户端程序命令
-
ssh命令–远程安全登录
-
环境
主服务器test01提供sshd服务
从服务器test02 充当客户机访问
- 命令基本格式
ssh user@host
#客户机
[root@test02 ~]# ssh root@192.168.100.110
The authenticity of host '192.168.100.110 (192.168.100.110)' can't be established.
ECDSA key fingerprint is SHA256:z9DjPlPWqhHOp4AsbDxOiSb4w86EvV9018/iUUHE1NM.
ECDSA key fingerprint is MD5:e5:d9:66:a5:4e:2f:fe:86:06:ef:cc:2f:09:4c:40:a7.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.100.110' (ECDSA) to the list of known hosts.
root@192.168.100.110's password:
Last login: Wed Jul 8 19:00:04 2020 from 192.168.100.1
[root@test01 ~]# touch /opt/test.txt
#服务机
[root@test01 ~]# cd /opt
[root@test01 opt]# ll
总用量 0
drwxr-xr-x. 3 root root 16 6月 10 09:09 opt
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rw-r--r--. 1 root root 0 7月 8 19:11 test.txt
- scp命令–远程安全复制
命令基本格式
格式一:scp user@host:file 1 file 2
格式二:scp file 1 user@host:file 2
选项:-r 表示递归复制
口诀:@在复制对象前就是从远程复制到本地(要先身份验证在复制)
@在复制对象后就是从本地复制到远程(要先复制后身份验证)
[root@test01 ~]# scp /etc/hosts root@192.168.100.120:/etc/hosts '将本机文件/etc/hosts以root权限复制到192.168.100.120中'
root@192.168.100.120's password:
hosts
[root@test01 ~]# scp root@192.168.100.120:/etc/hosts /etc/hosts1 '将远程的/etc/hosts文件复制到本地'
root@192.168.100.120's password:
hosts
- sftp命令–安全FTP上下载
命令基本格式
sftp user@host
get:下载
put:上传
选项:-r 表示递归复制
例如
[root@test02 .ssh]# sftp wangwu@192.168.100.110
Connected to 192.168.100.110.
sftp> ls
sftp> ls #登录到的是王五的家目录
wangwu.txt
sftp> get wangwu.txt #下载到登录sftp服务前的目录,这里是.ssh
Fetching /home/wangwu/wangwu.txt to wangwu.txt
sftp> exit
[root@test02 .ssh]# ls
id_ecdsa id_ecdsa.pub known_hosts wangwu.txt #复制过来的王五文件
[root@test02 .ssh]# touch root.txt
[root@test02 .ssh]# sftp wangwu@192.168.100.110
Connected to 192.168.100.110.
sftp> put root.txt #上传root.txt到王五的家目录
Uploading root.txt to /home/wangwu/root.txt
root.txt 100% 0 0.0KB/s 00:00
sftp> ls
root.txt wangwu.txt
1.2.2:Xshell
- Windows下一款功能非常强大的安全终端模拟软件
1.3:密钥对验证的SSH体系
1.3.1:构建密钥对验证的SSH体系
-
整体实现过程
-
环境ssh服务机test01;ssh客户机test02
-
1.创建密钥对(由客户端的用户lisi在本地创建密钥对)
公钥文件:id_rsa
公钥文件:id_rsa.pub
ssh-keygen命令
可用的加密算法:RSA或DSA
[zhangsan@test02 ~]$ ssh-keygen -t ecdsa #生成公共/私有ecdsa密钥对
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa): # 输入保存秘钥的文件,选择默认回车
Enter passphrase (empty for no passphrase): #输入加密密码
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:Ly0Ayf8n8CCYjLaoyuxYPFg3sMLhMx5MaPzBnKk4qqI root@test02
The key's randomart image is:
+---[ECDSA 256]---+
| |
|o o.o. |
|.=.*+ |
|Bo+=.o |
|=X*.+ = S |
|=*=. o * o |
|+o+ * + |
|B. . = |
|E+ |
+----[SHA256]-----+
[root@test02 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg
[zhangsan@test02 ~]# ls -a
. .bash_logout .config .ssh .xauthu4rj4W
.. .bash_profile .cshrc .tcshrc
anaconda-ks.cfg .bashrc .dbus .viminfo
.bash_history .cache initial-setup-ks.cfg .Xauthority
[zhangsan@test02 ~]# cd .ssh
[zhangsan@test02 .ssh]# ll
总用量 12
-rw-------. 1 root root 314 7月 9 00:26 id_ecdsa
-rw-r--r--. 1 root root 173 7月 9 00:26 id_ecdsa.pub
-rw-r--r--. 1 root root 177 7月 8 19:05 known_hosts
[root@test02 .ssh]#
注意:这里客户端生产密钥可以是root用户,也可以是普通用户
- 2.上传公钥文件 id_rsa.pub
任何方式均可(共享,FTP,Email,SCP,。。。)
例如
[zhangsan@test02 ~]# ls -a
. anaconda-ks.cfg .bashrc .dbus .viminfo
.. .bash_history .cache initial-setup-ks.cfg .Xauthority
123123 .bash_logout .config .ssh .xauthu4rj4W
123123.pub .bash_profile .cshrc .tcshrc
[zhangsan@test02 ~]# scp ~/.ssh/id_ecdsa.pub root@192.168.100.100:/tmp
- 3.导入公钥信息(导入到服务端用户66的公钥数据库)
将公钥文本添加到目标用户的公钥库
默认公钥库文件:~/.ssh/authorized_keys
[root@test01 ~]#mkdir /home/zhangsan/.ssh/
[root@test01 ~]#cat /tmp/id_ecdsa.pub >> /home/zhangsan/.ssh/authorized_keys
[root@test01 ~]#tail -1 /home/zhangsan/.ssh/authorized_keys
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJKqpTveFdFvp6YgahM5/E5PJ2VEUfpT8sM0TkSEVdHL8bvC5Xx+HXB3BMOHZuslIW+r4QlTW0xev/l+SIPP4Ow= zhangsan@test02
第二步和第三步可以采用另外一种方法
ssh-copy-id -i 公钥文件 user@host #密钥推送到对方用户的家目录
[zhangsan@test02 .ssh]# ssh-copy-id -i id_ecdsa.pub lisi@192.168.100.110
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_ecdsa.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
wangwu@192.168.100.110's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'wangwu@192.168.100.110'"
and check to make sure that only the key(s) you wanted were added.
- 查看公用密钥,客户端密钥对验证登录
[root@test01 tmp]# cd /home/zhangsan
[root@test01 zhangsan]# cd .ssh/
[root@test01 .ssh]# ls
authorized_keys
[root@test01 .ssh]# cat authorized_keys
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJKqpTveFdFvp6YgahM5/E5PJ2VEUfpT8sM0TkSEVdHL8bvC5Xx+HXB3BMOHZuslIW+r4QlTW0xev/l+SIPP4Ow= zhangsan@test02
[zhangsan@test02 .ssh]$ ssh lisi@192.168.100.110
Enter passphrase for key '/zhangsan/.ssh/id_ecdsa':
Last login: Thu Jul 9 00:38:15 2020
添加免密登录
[zhangsan@test02 .ssh]# ll
总用量 12
-rw-------. 1 root root 314 7月 9 00:26 id_ecdsa
-rw-r--r--. 1 root root 173 7月 9 00:26 id_ecdsa.pub
-rw-r--r--. 1 root root 177 7月 8 19:05 known_hosts
[zhangsan@test02 .ssh]# ssh-agent bash
[zhangsan@test02 .ssh]# ssh-add
Enter passphrase for /home/zhangsan/.ssh/id_ecdsa:
Bad passphrase, try again for /home/zhangsan/.ssh/id_ecdsa:
Identity added: /home/zhangsan/.ssh/id_ecdsa (/home/zhangsan/.ssh/id_ecdsa)
[zhangsan@test02 .ssh]# ssh lisi@192.168.100.110 #直接免密登录
Last login: Thu Jul 9 00:47:08 2020 from test01
[lisi@test01 ~]$
二:TCP Wrappers控制
2.1:TCP Wrappers概述
2.1.1:保护原理
2.1.2:保护机制的实现方式
-
方式一
通过tcpd主程序对其他服务程序进行包装
-
方式二
由其他服务程序调用libwrap.so.*链接库
2.1.3:访问控制策略的配置文件
ldd which sshd
查看模块
- /etc/hosts.allow
- /etc/hosts.deny
2.2:TCP Wrappers访问策略
2.2.1:设置访问控制策略
1)策略格式
服务列表:客户机地址列表
2)服务列表
多个服务以逗号分隔,ALL表示所有服务
3)客户机地址列表
多个地址以逗号分隔,ALL表示所有服务
允许使用通配符*和?
网段地址,如192.168.1 或者 192.168.1.0/255.255.255.0
区域地址,如.benet.com
2.2.2:策略的应用程序
先检查hosts.allow,找到匹配则允许访问
否则再检查hosts.deny,找到则拒绝访问
若两个文件中均无匹配策略,则默认允许访问
2.2.3:策略应用实例
仅允许从以下地址访问sshd服务
主机192.168.100.100
网段192.168.200.0/24
禁止其他所有地址访问受保护的服务
[root@test01 ~]# vim /etc/hosts.allow
sshd:192.168.100.100,192.168.200.*
[root@test01 ~]# vim /etc/hosts.deny
sshd:ALL
‘优先读取allow,然后再读取deny’
‘如果做黑名单,name白名单就不用写’
deny: sshd:ALL
黑名单:allow不写; deny:192.168.100
白名单:allow:sshd:192.168.100 ;deny: sshd:ALL