Linux云计算架构-ssh服务的使用和管理

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 [email protected]
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.
[email protected]'s password: 
Last login: Wed Aug  5 21:05:29 2020
[root@client20 ~]# exit
登出
Connection to 192.168.10.20 closed.

# 再次登录不需要确认
[root@server ~]# ssh [email protected]
[email protected]'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 [email protected]
[email protected]'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
[email protected]'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 [email protected]

# 开放防火墙的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
[email protected]'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
[email protected]'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 [email protected]
/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
[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh -p '222' '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

# 使用密钥直接登录
[root@client20 ~]# ssh [email protected] -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 [email protected]
[email protected]'s password: 
Permission denied, please try again.
[email protected]'s password: 
Permission denied, please try again.
[email protected]'s password: 
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
[root@client20 ~]# ssh [email protected]
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    

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/107828988