SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录.远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。与早期的Telent(远程登录)、RSH(Remote Shell,远程执行命令)、RCP(Remote File Copy,远程文件复制)等应用相比.SSH协议提供了更好的安全性。
将以OpenSSH为例,介绍Linux服务器的远程管理及安全控制。OpenSSH是实现SSH协议的开源软件项目,适用于各种LNIX、Linux操作系统。关于OpenSSH项目的更多内容可以访问其官方网站http: / /www . openssh.com。
在CentOS 7,3系统中,OpenSSH 服务器由openssh、openssh一server等软件包提供(默认已安装),并已将sshd添加为标准的系统服务。执行“systemctl start sshd”命令即可启动sshd服务.包括root在内的大部分用户(只要拥有合法的登录Shell)都可以远程登录系统。
sshd服务的配置文件默认位于/etc/ssh/sshd_config目录下,正确调整相关配置项,可以进一步提高shd远程登录的安全性。下面介绍最常用的一些配置项,关于sshd_config文件的更多配置可参考man手册页。
sshd服务使用的默认端口号为22,必要时建议修改此端口号.并指定监听服务的具体Р地址.以提高在网络中的隐蔽性。除此之外,SSH协议的版本选用V2比V1的安全性要更好.禁用DNS反向解析可以提高服务器的响应速度。
[root@lucky ~]# vim /etc/ssh/sshd_config
17 Port 22 //监听端口为22
19 ListenAddress 192.168.223.0 //监听地址为192.168.223.0网段
21 Protocol 2 //使用SSH V2协议
115 UseDNS no //禁用DNS反向解析
.........
[root@lucky ~]# systemctl start sshd
sshd 服务默认允许root用户登录.但在Internet中使用时是非常不安全的。普遍的做法如下:先以普通用户远程登入,进入安全Shell环境后,根据实际需要使用su命令切换为root用户。
关于sshd服务的用户登录控制通常应禁止root用户或密码为空的用户登录。另外,可以限制登录验证的时间(默认为⒉分钟)及最大重试次数,若超过限制后仍未能登录则断开连接。
[root@lucky ~]# vim /etc/ssh/sshd_config
37 LoginGraceTime 2m //登录验证时间为2分钟
38 #PermitRootLogin yes //禁止root用户登录
40 MaxAuthTries 6 //最大重试次数为6
64 PermitEmptyPasswords no //禁止空密码用户登录
...................
[root@lucky ~]# systemctl start sshd
当希望只允许或禁止某些用户登录时.可以使用AllowUsers 或 DenyUsers配置,两者用法类似(注意不要同时使用)。例如,若只允许jerry、tsengyia和acmin 用户登录.且其中 admin 用户仅能够从P地址为61,23.24.25的主机远程登录,则可以在/etc/ssh/sshd_config配置文件中添加以下配置。
对于服务器的远程管理,除了用户账号的安全控制以外.登录验证的方式也非常重要。sshd 服务支持两种验证方式---密码验证.密钥对验证,可以设置只使用其中一种方式,也可以两种方式都启用。
(1)密码验证:对服务器中本地系统用户的登录名称.密码进行验证。这种方式使用最为简便,但从客户端角度来看,正在连接的服务器有可能被假冒﹔从服务器角度来看,当遭遇密码穷举(暴力破解)攻击时防御能力比较弱。
()密钥对验证:要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建-对密钥文件(公钥、私钥).然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证,大大增强了远程管理的安全性。该方式不易被假冒.且可以免交互登录,在Shell中被广泛使用。
[root@lucky ~]# vim /etc/ssh/sshd_config
PasswordAuthentication yes //启用密码认证
AuthorizedKeysFile .ssh/authorized_keys //启用密钥对认证
PubkeyAuthentication yes //指定公钥库文件
.............
[root@lucky ~]# systemctl start sshd
(1)通过ssh命令可以远程登录sshd服务.为用户提供一个安全的Shell环境,以便对服务器进行管理和维护.使用时应指定登录用户、目标主机地址作为参数。若要登录主机192.168.223.128,以对方服务器的王五
[root@deft ~]# ssh [email protected]
[email protected]'s password:
Last failed login: Wed Dec 27 00:59:29 CST 2023 from 192.168.223.100 on ssh:notty
There were 4 failed login attempts since the last successful login.
[wangwu@lucky ~]$ whoami
wangwu
[wangwu@lucky ~]$ /sbin/ifconfig ens33 | grep 'inet'
inet 192.168.223.128 netmask 255.255.255.0 broadcast 192.168.223.255
如果sshd服务器使用了非默认的端口号(如22),则在登录时必须通过“一p”选项指定端口号。例如,执行以下操作将访问主机192.168.4.22的22端口,以对方服务器的wangwu用户验证登录。
[root@deft ~]# ssh -p 22 [email protected]
[email protected]'s password:
Last login: Wed Dec 27 00:59:33 2023 from 192.168.223.100
[wangwu@lucky ~]$
(2) scp远程复制
通过 scp 命令可以利用SSH 安全连接与远程主机相互复制文件。使用scp 命令时.除了必须指定复制源、目标之外,还应指定目标主机地址、登录用户.执行后根据提示输入验证口令即可。例如.以下操作分别演示了下行.上行复制的操作过程,将远程主机中的/etc/passwd文件复制到本机.并将本机的/etc/vsftpd目录复制到远程主机。
[root@deft ~]# scp [email protected]:/etc/passwd /root/pwd.txt
//将主机192.168.223.128的/etc/passwd/目录复制到本机/root/改名为pwd.txt
[email protected]'s password:
passwd 100% 2404 3.3MB/s 00:00
[root@deft ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg pwd.txt u789
[root@lucky ~]# scp -r /etc/vsftpd/ [email protected]:/opt
//将本机的/etc/vsftp/目录复制到主机192.168.223.100的/目录并改名opt
(3)sftp安全ftp
通过sftp命令可以利用SSH 安全连接与远程主机上传下载文件.采用了与FTP类似的登录过程和交互式环境.便于目录资源管理。
[root@lucky ~]# sftp [email protected]
[email protected]'s password:
Connected to 172.16.37.13.
sftp> ls
131 133 134 135 263 bdqn
(1)在客户端创建密钥对
在Linux客户端中,通过ssh-keygen工具为当前用户创建密钥对文件。可用的加密算法为ECDSA或DSA (ssh--keygen命令的“一t”选项用于指定算法类型)。例如.以wangwu用户登录客户端,并生成基于ECDSA 算法的SSH密钥对〈公钥、私钥〉文件.操作如下所示。
[wangwu@lucky ~]$ ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/wangwu/.ssh/id_ecdsa): //设置私钥位置
Created directory '/home/wangwu/.ssh'.
Enter passphrase (empty for no passphrase): //设置私钥密语
Enter same passphrase again: //确认所设置的短语
上述操作过程中,提示指定私钥文件的存放位置时.一般直接按Enter键即可,最后生成的私钥.公钥文件默认存放在宿主目录中的隐藏文件夹.ssh 下。私钥短语用来对私钥文件进行保护
[wangwu@lucky ~]$ ls -lh ~/.ssh/id_ecdsa* //确认生成的密钥文件
-rw------- 1 wangwu wangwu 227 12月 27 01:37 /home/wangwu/.ssh/id_ecdsa
-rw-r--r-- 1 wangwu wangwu 174 12月 27 01:37 /home/wangwu/.ssh/id_ecdsa.pub
新生成的密钥对文件中. id_ecdsa是私钥文件.权限默认为600,对于私钥文件必须妥善保管.不能泄露给他人id_ecdsa , pub是公钥文件,用来提供给SSH服务器。
(2)将公钥上传给服务器
将上一步生成的公钥文件上传至服务器,并部署到服务器端用户的公钥数据库中。上传公钥文件时可以选择SCP、FTP、Samba、HTTP 甚至发送E-mail等任何方式。例如,可以通过SCP方式将文件上传至服务器的/tmp录下。
[wangwu@lucky ~]$ scp /home/wangwu/.ssh/id_ecdsa.pub [email protected]:/tmp
3、在服务器中导入公钥文本
在服务器中,目标用户(指用来远程登录的账号lisi)的公钥数据库位于一/. ssh目录,默认的文件名是“authorized_keys”。如果目录不存在,需要手动创建。当获得客户端发送过来的公钥文件以后,可以通过重定向将公钥文本内容追加到目标用户的公钥数据库。
[root@deft ~]# mkdir /home/lisi/.ssh/
[root@deft ~]# cat /tmp/id_ecdsa.pub >>/home/lisi/.ssh/authorized_keys
[root@deft ~]# ls -l /home/lisi/.ssh/authorized_keys
-rw-r--r--. 1 root root 174 12月 27 01:49 /home/lisi/.ssh/authorized_keys
由于sshd 服务默认采用严格的权限检测模式〈StrictModes yes ),因此还需注意公钥库文件authorized_keys的权限——要求除了登录的目标用户或root 用户,同组或其他用户对该文件不能有写入权限,否则可能无法验证
(4)在客户端使用密钥对验证
当私钥文件〈客户端)、公钥文件〈服务器)均部署到位以后,就可以在客户端中进行测试了。首先确认客户端中当前的用户为wangwu,然后通过ssh命令以服务器端用户lisi的身份进行远程登录。如果密钥对验证方式配置成功,则在客户端将会要求输入私钥短语.以便调用私钥文件进行匹配(若未设置私钥短语.则直接登入目标服务器)。
[wangwu@lucky ~]$ ssh [email protected]
Activate the web console with: systemctl enable --now cockpit.socket
This system is not registered to Red Hat Insights. See https://cloud.redhat.com/
To register this system, run: insights-client --register
Last failed login: Wed Dec 27 00:33:02 CST 2023 from 192.168.223.100 on ssh:notty
There were 3 failed login attempts since the last successful login.
[lisi@deft ~]$ whoami
lisi