一、SSH远程管理
SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。与早期的Telent(远程登录)、RSH(Remote Shell,远程执行命令)、RCP(Remote File Copy,远程文件复制)等应用相比,SSH协议提供了更好的安全性。
OpenSSH是实现SSH协议的开源软件项目,适用于各种UNIX、Linux操作系统。关于OpenSSH项目的更多内容可以访问其官方网站http://www.openssh.com.
1、配置OpenSSH服务端
1、服务监听选项
# vim /etc/ssh/sshd_config
Port 2345 # 监听端口为2345
#AddressFamily any
ListenAddress 192.168.1.10 # 监听地址为192.168.1.10
#ListenAddress ::
# The default requires explicit activation of protocol 1
Protocol 2 # 使用SSH V2协议
......
UseDNS no # 禁用DNS反向解析
2、用户登录控制
LoginGraceTime 2m # 登录验证时间为2分钟
PermitRootLogin yes # 禁止root用户登录
#StrictModes yes
MaxAuthTries 6 # 最大重试次数为6
PermitEmptyPasswords no # 禁止空密码用户登录
AllowUsers zhangsan tom lisi@192.168.1.20 # 使用AllowUsers或DenyUsers可以配置只允许或禁止某些用户登录
3、登录验证方式
- 密码验证:对服务器中本地系统用户的登录名称、密码进行验证。这种方式使用最为简便, 但从客户端角度来看,正在连接的服务器有可能被假冒;从服务器角度来看,当遭遇密码穷举(暴力破解)攻击时防御能力比较弱。
- 密钥对验证:要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证,大大增强了远程管理的安全性。该方式不易被假冒, 且可以免交互登录,在Shell中被广泛使用。
PubkeyAuthentication yes # 启用密钥对验证
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys # 指定公钥库文件
PasswordAuthentication yes # 启用密码验证
# systemctl restart sshd # 如果报错请检查SELinux和防火墙是否关闭
2、使用SSH客户端程序
1、命令程序 ssh、scp、sftp
1、ssh远程登录
如果sshd服务器使用了默认的端口号(22),则在登录时可以省略"-p"选项及端口号
# ssh -p 2345 zhangsan@192.168.1.10
The authenticity of host '[192.168.1.10]:2345 ([192.168.1.10]:2345)' can't be established.
ECDSA key fingerprint is 46:cf:d2:fe:6d:ee:54:f7:2d:f6:c8:15:ec:3b:b6:c2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.1.10]:2345' (ECDSA) to the list of known hosts.
zhangsan@192.168.1.10's password:
$ whoami # 确认当前用户和当前主机地址
zhangsan
$ /sbin/ifconfig ens33 | grep "inet"
inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::1749:6c57:bf18:59fb prefixlen 64 scopeid 0x20<link>
2、scp远程复制
# vim /etc/ssh/sshd_config # 更改配置文件
PermitRootLogin yes
AllowUsers zhangsan tom root lisi@192.168.1.20
# systemctl restart sshd
下行复制(下载)
# scp -P 2345 root@192.168.1.10:/etc/passwd /root/pwd234.txt
root@192.168.1.10's password:
passwd 100% 2316 2.3KB/s 00:00
上行复制(上传)
# scp -P 2345 -r /etc/vsftpd/ root@192.168.1.10:/opt
root@192.168.1.10's password:
ftpusers 100% 125 0.1KB/s 00:00
user_list 100% 361 0.4KB/s 00:00
vsftpd.conf 100% 5116 5.0KB/s 00:00
vsftpd_conf_migrate.sh 100% 338 0.3KB/s 00:00
3、sftp安全FTP
# sftp -P 2345 zhangsan@192.168.1.10
zhangsan@192.168.1.10's password:
Connected to 192.168.1.10.
sftp> ls
sftp> put /boot/config-3.10.0-514.el7.x86_64
Uploading /boot/config-3.10.0-514.el7.x86_64 to /home/zhangsan/config-3.10.0-514.el7.x86_64
/boot/config-3.10.0-514.el7.x86_64 100% 134KB 134.5KB/s 00:00
sftp> ls
config-3.10.0-514.el7.x86_64
sftp> bye
2、图形工具Xshell
上传:rz
# rz
下载:sz 文件名
# sz /etc/passwd
3、构建密钥对验证的SSH体系
1、在客户端创建密钥对(这步做完可直接到第4点)
以zhangsan用户登录客户端,并生成基于ECDSA算法的SSH密钥对文件
# ssh -p 2345 zhangsan@192.168.1.10
zhangsan@192.168.1.10's password:
Last login: Fri Jun 19 08:59:33 2020 from 192.168.1.20
$ ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/zhangsan/.ssh/id_ecdsa): # 指定私钥位置(默认Enter)
Created directory '/home/zhangsan/.ssh'.
Enter passphrase (empty for no passphrase): # 设置私钥短语
Enter same passphrase again:
Your identification has been saved in /home/zhangsan/.ssh/id_ecdsa.
Your public key has been saved in /home/zhangsan/.ssh/id_ecdsa.pub.
The key fingerprint is:
61:21:d0:64:d9:0a:36:da:c3:0c:f2:11:c9:c0:c7:2e zhangsan@localhost.localdomain
The key's randomart image is:
+--[ECDSA 256]---+
|oooo.++o. |
|..=o+.o... |
| ooO o .o |
| Eo.= .. . |
| . . S |
| |
| |
| |
| |
+-----------------+
$ ls -lh ~/.ssh/id_ecdsa* # 确认生成的密钥文件
-rw-------. 1 zhangsan zhangsan 227 Jun 19 09:23 /home/zhangsan/.ssh/id_ecdsa # 私钥文件,权限默认为600
-rw-r--r--. 1 zhangsan zhangsan 192 Jun 19 09:23 /home/zhangsan/.ssh/id_ecdsa.pub # 公钥文件,用来提供给SSH服务器
2、将公钥文件上传至服务器*(可省略)
$ scp -P 2345 ~/.ssh/id_ecdsa.pub root@192.168.1.10:/tmp/
The authenticity of host '[192.168.1.10]:2345 ([192.168.1.10]:2345)' can't be established.
ECDSA key fingerprint is 46:cf:d2:fe:6d:ee:54:f7:2d:f6:c8:15:ec:3b:b6:c2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.1.10]:2345' (ECDSA) to the list of known hosts.
root@192.168.1.10's password:
id_ecdsa.pub 100% 192 0.2KB/s 00:00
3、在服务器中导入公钥文本*(可省略)
目标用户的公钥数据库位于~/.ssh目录,默认的文件名是"authorized-keys"。如果目录不存在,需要手动创建
# mkdir /home/tom/.ssh
# cat /tmp/id_ecdsa.pub >> /home/tom/.ssh/authorized_keys
# tail -l /home/tom/.ssh/authorized_keys
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHik3IqFyyqCAGCXJy/U9ekAX+xfpr9e6A5KKhAYF7Of/g77uUgU4dzQZm82JM3Btm6hb701HTEoJX9J0G8UuaY= zhangsan@localhost.localdomain
# ls -l /home/tom/.ssh/authorized_keys # 查看权限
-rw-r--r--. 1 root root 192 6月 19 09:30 /home/tom/.ssh/authorized-keys
$ ssh -p 2345 tom@192.168.1.10 # 登录成功
$ whoami
tom
4、在客户端使用密钥对验证
将公钥自动添加到目标主机user宿主目录下的.ssh/authorized_keys文件结尾
$ ssh-copy-id -p 2345 -i ~/.ssh/id_ecdsa.pub tom@192.168.1.10
/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
tom@192.168.1.10's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -p '2345' 'tom@192.168.1.10'"
and check to make sure that only the key(s) you wanted were added.
# ls -l /home/tom/.ssh/authorized_keys
-rw-------. 1 tom tom 192 6月 19 10:01 /home/tom/.ssh/authorized_keys
# tail -l /home/tom/.ssh/authorized_keys # 查看服务器中目标用户的公钥数据库
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHik3IqFyyqCAGCXJy/U9ekAX+xfpr9e6A5KKhAYF7Of/g77uUgU4dzQZm82JM3Btm6hb701HTEoJX9J0G8UuaY= zhangsan@localhost.localdomain
在用户为zhangsan时,然后通过ssh命令以服务器端用户tom的身份进行远程登录
$ ssh -p 2345 tom@192.168.1.10
Last login: Fri Jun 19 09:49:10 2020 from 192.168.1.10
$ whoami
tom
二、TCP Wrappers访问控制
1、TCP Wrappers 概述
TCP Wrappers将TCP服务程序“包裹”起来,代为监听TCP服务程序的端口,增加了一个安全检测过程,外来的连接请求必须先通过这层安全检测,获得许可后才能访问真正的服务程序。TCP Wrappers还可以记录所有企图访问被保护服务的行为,为管理员提供丰富的安全分析资料。
2、TCP Wrappers 的访问策略
1、策略的配置格式
〈服务程序列表〉:〈客户端地址列表〉
服务程序列表
- ALL:代表所有的服务。
- 单个服务程序:如"vsftpd"。
- 多个服务程序组成的列表:如"vsftpd,sshd”
客户端地址列表
- ALL:代表任何客户端地址。
- LOCAL:代表本机地址。
- 单个 IP 地址:如"192.168.4.4"。
- 网络段地址:如"192.168.4.0/255.255.255.0”
- 以"."开始的域名:如".bdqn.com"匹配bdqn. com域中的所有主机。
- 以".."结束的网络地址:如"192.168.4.”匹配整个192.168.4.0/24网段。
- 嵌入通配符"※","?":前者代表任意长度字符,后者仅代表一个字符,如"10.0.8.2*"匹 配以10.0.8.2开头的所有旧地址。不可与以开始或结束的模式混用。
- 多个客户端地址组成的列表:如"192.168.1., 172.16.16., .bdqn.com”。
2、访问控制的基本原则
首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问;否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问;如果检查上述两个文件都找不到相匹配的策略,则允许访问
3、TCP Wrappers 配置
# vim /etc/hosts.allow
sshd:192.168.2.10,192.168.2.* # 只从IP地址为192.168.2.10的主机或者位于192.168.2.0/24网段的主机访问sshd服务
# vim /etc/hosts.deny
sshd:all # 其他地址被拒绝
三、防止暴力破解ssh
脚本设置
# vim SSHD.sh
#!/bin/bash
# 定义失败登录尝试阈值
DEFINE=5
# 检查日志文件是否存在,若不存在则退出脚本
if [ ! -f /var/log/secure ]; then
echo "Error: SSH log file /var/log/secure not found."
exit 1
fi
# 分析日志,统计失败登录次数超过阈值的IP地址
echo "Analyzing failed SSH login attempts..."
cat /var/log/secure | grep 'Failed password for' | awk '{print $11}' | sort | uniq -c | while read -r line; do
IP=$(echo "$line" | awk '{print $2}')
COUNT=$(echo "$line" | awk '{print $1}')
# 如果失败登录次数超过阈值,并且该IP未在hosts.deny文件中
if [ "$COUNT" -gt "$DEFINE" ] && ! grep -qF "$IP" /etc/hosts.deny; then
# 添加IP到hosts.deny文件,并记录操作
echo "sshd:$IP" >> /etc/hosts.deny # 格式修正为标准格式
echo "Added $IP to /etc/hosts.deny due to exceeding $DEFINE failed login attempts"
fi
done
# 清理无用变量,优化内存使用
unset COUNT IP line
echo "Script completed."
评论区