引言
在生产环境中,服务器一般都是运行在机房中的,所以我们通常不会直接接触服务器硬件,而是通过各种远程管理方式对服务器进行控制,远程维护的方式更加便捷高效。
一、SSH 远程管理
SSH 是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH协议对通信双方的数据传输进行加密处理,其中包括用户登录时输入的用户口令。比以往的Telnet(远程登录)、RSH(远程执行命令)等传统的方式相比,SSH协议提供了更好的安全性。
1.配置 OpenSSH 服务端
1.1 SSH 服务及配置文件
- sshd 服务的配置文件默认位于 /etc/ssh/sshd_config 目录下,正确调整相关配置项,可以进一步提高 sshd 远程登录的安全性。
- 客户端配置文件 ssh_config,设置与客户端相关的应用可通过此文件实现
- 服务端配置文件 sshd_config,设置于服务端相关的应用可通过此文件实现
1.2 服务监听选项
sshd 服务使用的默认端口号为22,必要时建议修改此端口号,并指定监听服务的具体 IP 地址,以提高在网络中的隐蔽性。除此之外,SSH 协议的版本选用 V2 比 V1 的安全性要更好,禁用 DNS 反向解析可以提高服务器的响应速度。
[root@localhost ~]#vim /etc/ssh/sshd_config
......
Port 22 #监听端口22
ListenAddress 0.0.0.0 #监听地址为0.0.0.0,表示全部监听
Protocol 2 #使用SSHv2的版本
UseDNS no #禁用DNS反向解析
......
wq保存退出
[root@localhost ~]# systemctl restart sshd #重启sshd服务
1.3 用户登录控制
- sshd服务默认允许 root 用户登录,但是在 Internet 中这样使用时非常不安全的。普遍的做法是:先以普通用户远程登入,进入安全 Shell 环境后,根据实际需要使用 su 命令切换为 root 用户。
- 关于 sshd 服务的用户登录控制,通常应禁止 root 用户或密码为空的用户登录。另外,可以限制登录验证的时间(默认为2分钟)及最大重试次数,若超过限制后仍未能登录则断开连接。
[root@localhost ~]# vim /etc/ssh/sshd_config #修改sshd服务的主配置文件
......
LoginGraceTime 2m #登录验证时间为2分钟
PermitRootLogin no #禁止root用户登录
MaxAuthTries 6 #最大重试次数为6次
PermitEmptyPasswords no #禁止空密码登录
......
wq保存退出
[root@localhost ~]# systemctl restart sshd #重启sshd服务
- 当只允许或禁止某个用户登录时,可以更改 AllowUsers 或 DenyUsers 配置,两者用法类似,但是注意不能同时使用。
例如,允许张三和李四用户登录,且其中张三用户仅能从IP地址为192.168.1.2的地址远程登录。
[root@localhost ~]# vim /etc/ssh/sshd_config #修改sshd服务的主配置文件
AllowUsers lisi zhangsan@192.168.1.2 #多个用户之间用空格进行分隔
wq保存退出
[root@localhost ~]# systemctl restart sshd #重启sshd服务
1.4 登录验证方式
对于服务器的远程管理,除了用户账号的安全控制以外,登录验证的方式也非常重要。sshd服务支持两种验证方式,密码验证和密钥对验证。
-
密码验证:以服务器中本地系统用户的登录名称、密码进行验证。这种方式使用最为简便,但从客户机角度来看,正在连接的服务器有可能被假冒;从服务器角度来看,当遭遇暴力破解攻击时防御能力比较弱。
-
密钥对验证:要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥,然后将公钥文件存放到服务器指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密验证,这种方式不易被假冒,且可以免交互登录,在Shell中被广泛应用。
当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。对于安全性要求较高的服务器,建议将密码验证方式禁用,只允许启用密钥对。
[root@localhost ~]# vim /etc/ssh/sshd_config #修改sshd服务的主配置文件
......
PasswordAuthentication yes #启用密码验证
PubkeyAuthentication yes #启用密钥对验证
AuthorizedKeysFile .ssh/authorized_keys #指定公钥库文件(ls -a可查看)
......
wq保存退出
[root@localhost ~]# systemctl restart sshd #重启sshd服务
2.使用 SSH 客户端程序
在CentOS 7.3系统中,OpenSSH 服务器由 openssh、openssh-server 等软件包提供(默认已安装),其中包括 ssh 远程登录命令,以及 scp、sftp远程复制和文件传说命令等。
2.1 ssh远程登录
- 通过 ssh 命令可以远程登录 sshd 服务,为用户提供一个安全的 Shell 环境,以便对服务器进行管理和维护。
[root@localhost ~]#ssh root@192.168.8.129
root@192.168.8.129's password:
Last login: Tue Aug 31 15:52:23 2021 from 192.168.8.128
- 当用户第一次登陆 SSH 服务器时,必须接受服务器发来的 RSA 密钥后才可以继续验证。接受的密钥信息将保存在 ~/.ssh/known_hosts 文件中。密码验证成功以后,就可以登录到目标服务器了。
[root@localhost ~]#ssh gl@192.168.8.129
The authenticity of host '192.168.8.129 (192.168.8.129)' can't be established.
ECDSA key fingerprint is SHA256:z7ldhBdpDDw5ui84Yp2MVyk7GfDzPzmluoeMma5x9RE.
ECDSA key fingerprint is MD5:40:37:f8:ba:15:a1:ba:58:24:83:63:72:7d:dd:e7:7b.
Are you sure you want to continue connecting (yes/no)? yes
- 如果 sshd 服务器使用了非默认的22端口,在登录时必须通过“-p”选项来指定端口号。
[root@localhost ~]#ssh -p2335 gl@192.168.8.129
- 在平时工作中,我们远程登录的时候,偶尔会被禁止登陆,并弹出消息。这时候就需要我们手动删除掉~/.ssh/known_hosts 文件里的内容。这是因为 SSH 会把你访问过计算机的公钥都记录在这个文件中,当你下次访问相同的计算机时候,OpenSSH 会核对公钥,如果不对就会发出警告,避免受到 DNS Hijack 之类的攻击。
[root@localhost ~]#cat /root/.ssh/known_hosts #查看里面的信息
192.168.8.129 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBC5w+BF4m57zC3SW0kXaLHsUwDkm8IMy+d4le/136bHfYjuCg3S+GvfkzFHBUsI9F487QVDYCrUG0Clks0veHkI=
[root@localhost ~]# > /root/.ssh/known_hosts #清除信息
[root@localhost ~]#cat /root/.ssh/known_hosts #查看是否清除掉
[root@localhost ~]#
2.2 scp远程复制
通过 scp 命令可以利用 SSH 安全连接与远程主机相互复制文件。使用 scp 命令时,除了必须指定复制源、目标之外,还应指定目标主机地址、登录用户,执行后提示验证口令即可。
- 本地文件复制到服务器
[root@localhost /home]#scp root@192.168.8.129:/home/yy66.txt ./
root@192.168.8.129's password:
yy66.txt 100% 10 8.5KB/s 00:00
[root@localhost /home]#ls
yy66.txt
- 复制服务器目录到本地(目录一定要加 “-r”选项)
[root@localhost /home]#scp -r /var/log/ root@192.168.8.129:/home/
root@192.168.8.129's password:
tallylog 100% 0 0.0KB/s 00:00
......
#到本地上机器查看
[root@localhost /home]#ls
log
2.3 sftp 安全 FTP
-
sftp 是安全文件传送协议,可以为传输文件提供一种安全的网络的加密方法。
-
sftp与ftp 有着几乎一样的语法和功能。SFTP 为 SSH 的其中一部分,其实在 SSH 软件包中,已经包含了一个叫作 SFTP(Secure FileTransferProtocol) 的安全文件信息传输子系统,SFTP 本身没有单独的守护进程,它必须使用sshd 守护进程(端口号默认是22))来完成相应的连接和答复操作。
-
SFTP 使用了加密和解密技术,所以传输效率比普通的 FTP 要低的多,如对网络安全性要求较高,可以使用SFTP代替FTP。
案例
①从服务器上下载压缩文件到本地/home下
[root@localhost /]#sftp root@192.168.8.129
root@192.168.8.129's password:
Connected to 192.168.8.129.
sftp> get /home/httpd-2.4.25.tar(1).gz /./
Fetching /home/httpd-2.4.25.tar(1).gz to /./httpd-2.4.25.tar(1).gz
/home/httpd-2.4.25.tar(1).gz 100% 8262KB 50.7MB/s 00:00
sftp> cd /home/
sftp> ls
abc.txt httpd-2.4.25.tar(1).gz log
yy66.txt
sftp>
②把本地文件上传到服务器上
[root@localhost /home]#ls
yy66.txt
[root@localhost /home]#sftp root@192.168.8.129
root@192.168.8.129's password:
Connected to 192.168.8.129.
sftp> put yy66.txt /home
Uploading yy66.txt to /home/yy66.txt
yy66.txt 100% 10 11.9KB/s 00:00
sftp>
到服务器上查看是否上传成功
[root@localhost /home]#ls
abc.txt httpd-2.4.25.tar(1).gz log yy66.txt
注意:如果是目录的话必须加“-r”选项才能成功进行操作
3.构建密钥对验证的 SSH 体系
密钥对验证方式可以为远程登录提供更好的安全性
3.1 在客户端创建密钥对
- 通过 ssh-keygen 工具为当前用户创建密钥对文件。可用的加密算法为 RSA、ECDSA或SA等( ssh- keygen命令的"-t"选项用于指定算法类型)。
[root@localhost ~]#useradd lisi #创建用户李四
[root@localhost ~]#passwd lisi
[root@localhost ~]#su - lisi #切换到李四用户
[lisi@localhost ~]$ssh-keygen -t ecdsa #生成基于ecdsa算法的密钥对
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/lisi/.ssh/id_ecdsa):
Created directory '/home/lisi/.ssh'. #指定私钥位置
Enter passphrase (empty for no passphrase): #设置私钥短语
Enter same passphrase again: #确认所设置的短语
Your identification has been saved in /home/lisi/.ssh/id_ecdsa.
Your public key has been saved in /home/lisi/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:64rqsm3zUpsrVAbGWUVsymIJRTA4mGZfYhPY8H9j4K4 lisi@localhost.localdomain
The key's randomart image is:
+---[ECDSA 256]---+
|=B*+o+o |
|*=*= .o |
|o+o=++ |
| +.B . |
| . + o +S |
| . o o .. |
| . . + . |
|..= +. . |
|.=+E+.... |
+----[SHA256]-----+
[lisi@localhost ~]$cd .ssh/
[lisi@localhost ~/.ssh]$ls -a #查看生成的密钥对
. .. id_ecdsa id_ecdsa.pub
- 生成的密钥对文件中,id_ecdsa 是私钥文件,权限默认为600,对于私钥文件必须妥善保管,不能泄露给其他人;id_ecdsa.pub 是公钥文件,用来提供给 SSH 服务器。
3.2 将公钥文件上传至服务器
[lisi@localhost ~/.ssh]$ssh-copy-id -i id_ecdsa.pub zhangsan@192.168.8.129 #将公钥导入到张三用户中
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_ecdsa.pub"
The authenticity of host '192.168.8.129 (192.168.8.129)' can't be established.
ECDSA key fingerprint is SHA256:z7ldhBdpDDw5ui84Yp2MVyk7GfDzPzmluoeMma5x9RE.
ECDSA key fingerprint is MD5:40:37:f8:ba:15:a1:ba:58:24:83:63:72:7d:dd:e7:7b.
Are you sure you want to continue connecting (yes/no)? yes #这里需要输入yes确认
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/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.8.129's password: #输入张三用户的登录密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.8.129'"
and check to make sure that only the key(s) you wanted were added.
3.3 查看导入的公钥文件
[root@localhost ~/.ssh]#su - zhangsan
上一次登录:二 8月 31 18:44:12 CST 2021pts/0 上
[zhangsan@localhost ~]$ls -a
. .bash_history .bash_profile .cache .mozilla .ssh
.. .bash_logout .bashrc .config opt
[zhangsan@localhost ~]$cd .ssh
[zhangsan@localhost ~/.ssh]$ls
authorized_keys known_hosts
[zhangsan@localhost ~/.ssh]$cat authorized_keys #查看公钥文件
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLQEiM/EQb/j/FtFtWmRxA/AmYIbWpE+CDMYjvb0QMASUXsyoiwmG45M1C4Wbaov9bF/HeexvEZQqV/PMidXpIs= lisi@localhost.localdomain
3.4 在客户端使用密钥对验证
- 这时候李四用户再登录服务器张三用户只需要输入密钥对密码即可登录
[lisi@localhost ~/.ssh]$ssh zhangsan@192.168.8.128
Enter passphrase for key '/home/lisi/.ssh/id_ecdsa': #输入密码
Last login: Tue Aug 31 18:48:56 2021 #成功登入
免交互配置
[lisi@localhost ~]$ssh-agent bash #开启代理
[lisi@localhost ~]$ssh-add #添加密钥信息到agent缓存中
Enter passphrase for /home/lisi/.ssh/id_ecdsa: #输入密码
Identity added: /home/lisi/.ssh/id_ecdsa (/home/lisi/.ssh/id_ecdsa)
[lisi@localhost ~]$ssh zhangsan@192.168.8.128 #不需要密码就能登录
Last login: Tue Aug 31 18:59:22 2021 from 192.168.8.129
二、TCP Wrappers 访问控制
在Linux系统中,许多网络服务针对客户端提供了访问控制机制,如Samba、BIND、 HPTPD、OpenSSH等。
TCP Wrappers(TCP封套),以作为应用服务与网络之间的一道特殊防线,提供额外的安全保障
1.概述
-
TCP wrappers 将 TCP服务程序"包裹"起来, 代为监听 TCP 服务程序的端口,增加了一个安全检测过程,外来的连接请求必须先通过这层安全检测,获得许可后才能访问真正的服务程序
-
TCP Wrappers 还可以记录所有企图访问被保护服务的行为,为管理员提供丰富的安全分析资料
-
TCP Wrappers 的访问控制是基于 TCP 协议的应用服务
-
TCP Wrappers 只能控制 TCP 协议的应用服务,并且不是所有基于 TCP 协议的应用服务都能接受它的控制
2 TCP Wrappers 保护机制的两种实现方式
-
直接使用 tcpd 程序对其他服务程序进行保护,需运行 tcpd 程序。
-
由其他网络服务程序调用 libwrap.so.* 链接库,不需要运行tcpd程序,此方式的应用更广泛,更有效率。
3.TCP Wrappers 的访问策略
-
TCP Wrappers 机制的保护对象为各种网络服务程序,针对访问服务的客户机地址进行访问控制
-
对应的两个策略文件为 /etc/hosts.allow 和 /etc/hosts.deny ,分别用来设置允许和拒绝的策略
3.1 策略的配置格式
两个策略文件的作用相反,但是配置记录的格式相同,如下所示
语法格式:<服务程序列表>:<客户端地址列表>
服务程序列表、客户机地址列表之间以冒号分隔,在每个列表内的多个项之间以逗号分隔
-
服务程序列表
①ALL:代表所有的服务
②单个服务程序:如"vsftpd"
③多个服务程序组成的列表:如"vsftpd,sshd"。 -
客户机地址列表
①ALL:代表任何客户端地址
②LOCAL:代表本机地址。
③允许使用通配符"*“和”?”:前者代表任意长度字符,后者仅代表一个字符
3.2 访问控制的基本原则
首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问,否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问;如果检查上述两个文件都找不到相匹配的策略,则允许访问。
3.3 TCP Wrappers 配置
- 要求:仅允许192.168.1.0网段的主机访问sshd服务
操作如下:
[root@localhost ~]# vim /etc/hosts.allow
sshd:192.168.1.
[root@localhost ~]# vim /etc/hosts.deny
sshd:ALL
总结
ssh 不仅仅只是用来远程登录主机,借助它我们可以把很多的远程操作自动化。