文章目录
Linux云计算架构-ssh服务的使用和管理
1. SSH协议和sshd服务程序
①SSH(Secure Shell),安全外壳协议,建立在传输层和应用层的基础上。是一款能够以安全的方式提供远程登录的协议,也是目前远程管理Linux的首选。【ssh加密传输、telnet明文传输】
②要想使用SSH协议来远程管理Linux系统,需要部署配置sshd服务程序。
③使用sshd服务程序远程管理主机,有两种安全验证方式:
- 基于口令的验证——要账号密码才能登录
- 基于密钥的验证——直接登录,但是要有密钥
④在RHEL7或Centos7系统中,默认安装并启用了sshd服务程序,用户可以直接使用sshd服务程序来登录远程主机。
2. 安装ssh服务
协议名:SSH
服务程序名:sshd
软件包名:openssh
# 默认安装了ssh服务
# ssh这个命令是安装在客户端上的
[root@server ~]# which ssh
/usr/bin/ssh
[root@server ~]# rpm -qf /usr/bin/ssh
openssh-clients-7.4p1-16.el7.x86_64
# 如果没有安装,可以通过以下方式安装。
# ssh服务需要4个软件包:openssh openssh-clients openssh-server openssh-askpass
# 本地有rpm包,这里建议使用yum安装。
[root@server ~]# ll /media/cdrom/Packages/openssh*
-rw-rw-r--. 1 root root 522344 4月 25 2018 /media/cdrom/Packages/openssh-7.4p1-16.el7.x86_64.rpm
-rw-rw-r--. 1 root root 78040 4月 25 2018 /media/cdrom/Packages/openssh-askpass-7.4p1-16.el7.x86_64.rpm
-rw-rw-r--. 1 root root 670336 4月 25 2018 /media/cdrom/Packages/openssh-clients-7.4p1-16.el7.x86_64.rpm
-rw-rw-r--. 1 root root 98792 4月 25 2018 /media/cdrom/Packages/openssh-keycat-7.4p1-16.el7.x86_64.rpm
-rw-rw-r--. 1 root root 469340 4月 25 2018 /media/cdrom/Packages/openssh-server-7.4p1-16.el7.x86_64.rpm
[root@server ~]# yum install openssh openssh-server openssh-clients
# 查询ssh软件包是否安装成功
[root@server ~]# rpm -qa | grep openssh
openssh-clients-7.4p1-21.el7.x86_64
openssh-7.4p1-21.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64
# 查看下ssh服务都有哪些配置文件
[root@server ~]# rpm -ql openssh
3. ssh服务程序的配置
服务端配置文件:/etc/ssh/sshd_config
客户端配置文件:etc/ssh/ssh_config
有服务端才可以被其他主机使用ssh远程连接;
有客户端才可以使用ssh命令连接其他远程主机。
# 服务的启动和关闭
[root@server ~]# systecmtl start|stop|restart|enable sshd
# 查看服务的自启动状态
[root@server ~]# systemctl list-unit-files | grep sshd
3.1 ssh服务端配置文件详解
服务端配置文件:/etc/ssh/sshd_config
①sshd服务日志:/var/log/secure
②在哪里指定了sshd的服务日志:/etc/rsyslog.conf
③sshd服务日志级别:#LogLevel INFO
3.2 ssh远程登录
方法1:ssh 用户名@[远程服务器IP地址或者主机名] -p 端口号
# 首次登录需要验证
[root@server ~]# ssh root@192.168.10.20
The authenticity of host '192.168.10.20 (192.168.10.20)' can't be established.
ECDSA key fingerprint is SHA256:hMnEgq8dBQG9YVbALC/RQ4zVDFuP8Xm2eqzCbZ853LE.
ECDSA key fingerprint is MD5:08:43:dd:9e:dd:25:bd:fd:aa:ed:3a:89:ed:4e:1f:ac.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.20' (ECDSA) to the list of known hosts.
root@192.168.10.20's password:
Last login: Wed Aug 5 21:05:29 2020
[root@client20 ~]# exit
登出
Connection to 192.168.10.20 closed.
# 再次登录不需要确认
[root@server ~]# ssh root@192.168.10.20
root@192.168.10.20's password:
Last login: Wed Aug 5 21:14:32 2020 from 192.168.10.43
[root@client20 ~]# exit
登出
Connection to 192.168.10.20 closed.
# 以普通用户登录
# abong这个用户是远程主机上的一个普通用户
[root@server ~]# ssh abong@192.168.10.20
abong@192.168.10.20's password:
[abong@client20 ~]$ exit
登出
Connection to 192.168.10.20 closed.
第一次远程登录时,没有保存远程主机的信息。需要确认是否继续连接,确认后,会将远程主机的信息写入到known_hosts
文件中,再次登录时就不需要确认了。
[root@server ~]# ll /root/.ssh/known_hosts
-rw-r--r--. 1 root root 1 8月 5 21:03 /root/.ssh/known_hosts
方法2:ssh -l [远程主机用户名] [远程服务器IP地址或者主机名] -p 端口号
[root@server ~]# ssh -l abong 192.168.10.20
abong@192.168.10.20's password:
Last login: Wed Aug 5 21:16:59 2020 from 192.168.10.43
[abong@client20 ~]$ exit
登出
Connection to 192.168.10.20 closed.
4. sshd服务管理
4.1 端口管理
# 修改sshd监听端口号
# sshd默认监听22端口号,可以使用多个port
# 这里建议修改默认端口号,防暴力破解
[root@server ~]# semanage port -l | grep ssh
ssh_port_t tcp 22
[root@server ~]# vim /etc/ssh/sshd_config
17 Port 220
# 若selinux处于enforcing模式,则违反selinux的请求都会被拒绝。这会导致无法重启sshd服务。
# 可以修改成permissive警告模式或者直接关闭selinux
[root@server ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@server ~]# getenforce
Enforcing
[root@server ~]# setenforce 0
[root@server ~]# getenforce
Permissive
# 重启sshd服务并查看sshd监听端口号,可以看到已经修改为220了
# 以上设置selinux的方式仅是临时修改,需要修改/etc/selinux/config文件才会使得220端口永久生效,否则当服务器重启后,sshd服务会起不来。
[root@server ~]# systemctl restart sshd
[root@server ~]# netstat -antup | grep sshd
tcp 0 0 0.0.0.0:220 0.0.0.0:* LISTEN 20973/sshd
tcp6 0 0 :::220 :::* LISTEN 20973/sshd
# 这里介绍一种配置selinux端口号的方法,就无需修改selinux的状态了
# 查看selinux允许ssh可以使用的端口,发现没有220
[root@server ~]# semanage port -l | grep ssh
ssh_port_t tcp 22
# 查看下220端口号有没有在使用,有就换一个端口号
[root@server ~]# semanage port -l | grep 220
# 220有被使用,那添加222到ssh允许端口列表中,说明ssh才可以合法的使用该端口
[root@server ~]# semanage port -a -t ssh_port_t -p tcp 222
[root@server ~]# semanage port -l | grep ssh
ssh_port_t tcp 222, 22
# 这是需要重新修改ssh的配置文件的Port为222,然后重启sshd服务
# 重启后仍然生效
[root@server ~]# vim /etc/ssh/sshd_config
17 Port 222
[root@server ~]# systemctl restart sshd
[root@server ~]# netstat -antup | grep sshd
tcp 0 0 0.0.0.0:222 0.0.0.0:* LISTEN 18913/sshd
tcp6 0 0 :::222 :::* LISTEN 18913/sshd
# 只能本地连,其他主机不能通过ssh连接该主机
[root@server ~]# ssh -p 222 root@192.168.10.10
# 开放防火墙的222端口号,允许其他主机通过ssh命令远程连接
[root@server ~]# firewall-cmd --permanent --zone=public --add-port=222/tcp
success
[root@server ~]# firewall-cmd --reload
success
# 测试连接
[root@client20 ~]# ssh -p 222 192.168.10.10
root@192.168.10.10's password:
Last login: Wed Aug 5 21:59:09 2020 from server
[root@server ~]# exit
登出
Connection to 192.168.10.10 closed.
# 当20远程连接10时,10主机上可以看到来自于20的连接
[root@client20 ~]# ssh -p 222 192.168.10.10
root@192.168.10.10's password:
Last login: Wed Aug 5 22:23:30 2020 from 192.168.10.20
[root@server ~]# netstat -antup | grep ssh
tcp 0 0 0.0.0.0:222 0.0.0.0:* LISTEN 6901/sshd
tcp 0 0 192.168.10.10:222 192.168.10.20:36252 ESTABLISHED 19271/sshd: root@pt
tcp6 0 0 :::222
4.2 ssh安全调优
# 输入密码的时限,默认2分钟
37 #LoginGraceTime 2m
# 是否允许root登录
38 #PermitRootLogin yes
# 是否需要密码登录【可以不需要密码,直接密钥登录】
65 PasswordAuthentication yes
# 是否允许空密码登录
64 #PermitEmptyPasswords no
# 添加警告信息,当远程登录时会输出警告信息
[root@server ~]# cat /etc/motd
# 是否显示上次登录的信息
106 #PrintLastLog yes
# 当ssh退出时,保持tcp连接不断开,方便下次连接,但会占用一定的系统资源。
107 #TCPKeepAlive yes
# 是否使用DNS判断客户端IP的合法性【内网不太需要,要判断的话连接速度会慢一些】
115 #UseDNS yes
5. xshell和putty的使用
5.1 当服务器能够连接外网时,使用xshell工具进行远程连接。
测试机的网络连接模式为NAT模式,也可以是桥接模式,这里以NAT模式为例。从下图可以看到,服务器可以连接外网,也可以和物理机相互通信。
下面进行xshell工具的远程登录测试:
1、打开xshell,新建会话,输入名称和主机ip,点击确定
2、连接
3、输入用户名和密码,这里用户名是root
可以看到,已经连接成功了。
由于虚拟机是以dhcp方式获取ip地址的,每次连接的ip地址都不一样,可以用命令ifconfig
获取最新的ip地址再进行连接,当然,固定ip地址是不会出现这种情况的。
5.2 当服务器能够连接外网时,使用PuTTY配置工具进行远程连接。
使用的仍然是上面的服务器和物理机。
6. sshd服务防止暴力破解
6.1 配置安全的sshd服务
①密码复杂
②修改默认端口号,不使用22端口号
③不允许root账户直接登录,使用普通账户进行登录,必要时再从普通用户切换到root用户。
④不使用密码登录,通过密钥登录
# 192.168.10.20配置密钥远程登录192.168.10.10
# 客户端生成密钥对(公钥和私钥),默认保存路径为/root/.ssh/
[root@client20 ~]# 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:PKIu+TaCtxUCVMIv5ntgYgmtw3Tu6KQi1biUn4LJkx8 root@client20
The key's randomart image is:
+---[RSA 2048]----+
|.o.. |
|... |
|... |
|.=.o . |
|*.*+. . S |
|+B=o.o . . |
|=O*Eo. |
|O*B=* |
|=o=Oo. |
+----[SHA256]-----+
[root@client20 ~]# ll /root/.ssh/
总用量 12
-rw-------. 1 root root 1679 8月 5 23:05 id_rsa
-rw-r--r--. 1 root root 395 8月 5 23:05 id_rsa.pub
-rw-r--r--. 1 root root 175 7月 29 20:38 known_hosts
# 发布公钥到服务器
# 使用默认端口号可以用这个:ssh-copy-id -i 192.168.10.10
[root@client20 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p 222 root@192.168.10.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.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@192.168.10.10's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -p '222' 'root@192.168.10.10'"
and check to make sure that only the key(s) you wanted were added.
# 使用密钥直接登录
[root@client20 ~]# ssh root@192.168.10.10 -p 222
Last login: Wed Aug 5 22:25:28 2020 from 192.168.10.20
6.2 使用开源的防护软件
fail2ban
开源防护软件:通过分析一定时间内的服务日志,将满足动作的相关IP利用防火墙iptables,将其加入到REJECT列表一定时间。
官方地址:http://www.fail2ban.org
fail2ban源码包:https://github.com/fail2ban/fail2ban/archive/0.9.4.tar.gz
# yum安装fail2ban
# 检查python版本,2.4以上可使用。
[root@server ~]# python -V
Python 2.7.5
# 安装依赖包
[root@server ~]# yum install epel-release -y
# 安装fail2ban
[root@server ~]# yum install fail2ban -y
[root@server ~]# ll /etc/fail2ban/
总用量 56
drwxr-xr-x. 2 root root 4096 8月 5 23:23 action.d
-rw-r--r--. 1 root root 2817 1月 11 2020 fail2ban.conf
drwxr-xr-x. 2 root root 6 7月 29 20:53 fail2ban.d
drwxr-xr-x. 3 root root 4096 8月 5 23:23 filter.d
-rw-r--r--. 1 root root 25740 7月 29 20:53 jail.conf
drwxr-xr-x. 2 root root 31 8月 5 23:23 jail.d
-rw-r--r--. 1 root root 2827 1月 11 2020 paths-common.conf
-rw-r--r--. 1 root root 930 1月 11 2020 paths-fedora.conf
# 动作文件(action.d/iptables.conf)
# 日志匹配条件文件(filter.d/sshd.conf)
# 日志分析规则文件(jail.conf)
# 需要设置的只有jail.conf文件。启用SSHD服务的日志分析,指定动作阀值即可。
# 应用实例
# SSH 远程登录5分钟内3次密码验证失败,禁止用户IP访问主机1小时,1小时后该限制自动解除,用户可重新登录
# 大概279行
[root@server ~]# vi /etc/fail2ban/jail.conf
[DEFAULT] # 全局配置
gnoreip = 127.0.0.1/8 # 忽略的 IP 列表,不受设置限制。
bantime = 600 # 屏蔽时间,单位:秒。
findtime = 600 # 这个时间段内超过规定次数会被 ban 掉。
maxretry = 3 # 最大尝试次数。
backend = auto # 日志修改检测机制(gamin、polling 和auto这三种)。
[sshd] # 单个服务检查设置,如设置 bantime、findtime、maxretry 和全局冲突,服务优先级大于全局设置。
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
# 加入如下内容
enabled = true # 是否激活此项(true/false)修改成 true。
filter = sshd # 过滤规则filter的名字,对应 filter.d目录下的sshd.conf。
action = iptables[name=SSH, port=ssh, protocol=tcp] # 动作的相关参数,对应action.d/iptables.conf 文件。
sendmail-whois[name=SSH,dest=root@localhost,sender=fail2ban@localhost, sendername="Fail2Ban"] # 触发报警的收件人。
logpath = /var/log/secure # 检测的系统的登陆日志文件。这里要写sshd 服务日志文件。默认为logpath = /var/log/sshd.log。
#5分钟内3次密码验证失败,禁止用户IP访问主机1小时。 配置如下。
bantime = 3600 # 禁止用户 IP 访问主机 1 小时。
findtime = 300 # 在5分钟内出现规定次数就开始执行
maxretry = 3 # 3次密码验证失败。
# 启动并设置开机自启
[root@server ~]# systemctl start fail2ban
[root@server ~]# systemctl enable fail2ban
Created symlink from /etc/systemd/system/multi-user.target.wants/fail2ban.service to /usr/lib/systemd/system/fail2ban.service.
# 客户端3次输错密码,会被拒绝登录1小时
[root@client20 ~]# ssh root@192.168.10.10
root@192.168.10.10's password:
Permission denied, please try again.
root@192.168.10.10's password:
Permission denied, please try again.
root@192.168.10.10's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
[root@client20 ~]# ssh root@192.168.10.10
ssh: connect to host 192.168.10.10 port 22: Connection refused
# 查看iptables,可以看到192.168.10.20被REJECT了
[root@server ~]# iptables -L | tail -4
Chain f2b-SSH (1 references)
target prot opt source destination
REJECT all -- 192.168.10.20 anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere
# 查看fail2ban的状态
# 查看有哪些服务被分析
[root@server ~]# fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
# 查看指定服务分析的结果,可以看到192.168.10.20被ban了
[root@server ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 3
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 192.168.10.20
# fail2ban的日志文件
[root@server ~]# ll /var/log/fail2ban.log
-rw-------. 1 root root 1868 8月 6 00:00 /var/log/fail2ban.log
①由于fail2ban是通过iptables去限制目标主机的,如果iptables清空或者重启后,也要重启fail2ban
②在jail.conf配置文件中,port指端口号,默认是22,如果sshd服务中修改了默认端口号,则jail.conf配置文件也要做对应的修改。
③修改了sshd或者fail2ban的配置文件后,都要重启对应的服务。
# 去除限制,通过iptables可以看到限制已经去除了
# 192.168.10.20可以再次尝试远程登录192.168.10.10了
[root@server ~]# fail2ban-client set sshd unbanip 192.168.10.20
1
[root@server ~]# iptables -L | tail -3
Chain f2b-SSH (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere