简介:SSH是一种协议,主要使用客户端—服务器架构在两个系统之间提供加密登录会话的安全通信,会阻止入侵者从连接中手机未加密的密码。基本的OpenSSH软件包包含:通用的openssh软件包、openssh-server软件包以及openssh-clients软件包。OpenSSH软件包也需要OpenSSH软件包openssl-libs,它会安装重要的加密库来启用OpenSSH对通讯进行加密。
一、SSH和OpenSSH的关系与区别
-
SSH(shell)是登录远程机器并在该机器上执行命令的程序。
-
SSH(协议)通过不安全的网络在两个不可信主机间提供安全加密的通讯。
主机密钥验证是使用SSH协议的主机。密钥是首次安装OpenSSH,或者主机第一次引导时自动生成的加密密钥。
OpenSSH是Linux、Uninx和类操作系统支持SSH协议的实现。主要组件由以下工具组成:
工具 | 说明 |
---|---|
ssh | 远程登录程序(SSH客户端) |
sshd | OpenSSH SSH守护进程 |
scp | 安全的远程文件复制程序 |
sftp | 安全的文件传输程序 |
ssh-agent | 用于缓存私钥的身份验证代理 |
ssh-add | 为ssh-agent添加私钥身份 |
ssh-keygen | 生成、管理并转换ssh验证密钥 |
ssh-copy-id | 将本地公钥添加到远程SSH服务器上的authorized_keys文件的脚本 |
ssh-keyscan | 手机SSH公共主机密钥 |
二、示例:配置OpenSSH服务
配置并启动OpenSSH服务器。
先决条件
- 查看系统中是否已经安装openssh-server软件包。
[xiaoshen@ssh-server ~]$ rpm -qa openssh-server
openssh-server-8.0p1-13.el8.x86_64
- 如果没有安装,请执行以下命令安装openssh-server。
[xiaoshen@ssh-server ~]$ sudo dnf install openssh-server
流程
- 在当前系统会话中启动sshd守护进程,并设置系统引导时自启。
[xiaoshen@ssh-server ~]$ sudo systemctl enable --now sshd
[xiaoshen@ssh-server ~]$ systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-08-06 13:57:56 CST; 3h 51min ago
Docs: man:sshd(8)
man:sshd_config(5)
...
- 改变客户端登录验证前和登录后验证后后的欢迎信息。(可选)
登录前
:
[xiaoshen@ssh-server ~]$ sudo vim /etc/issue
Welcome to ssh-server host.
确保/etc/ssh/sshd_config中未注释掉Banner选项,并且其值包含/etc/issue。
[xiaoshen@ssh-server ~]$ sudo less /etc/ssh/sshd_config | grep Banner
Banner /etc/issue
登录后
:
[xiaoshen@ssh-server ~]$ sudo vim /etc/motd
Login Successful!
确保/etc/ssh/sshd_config中的Banner选项包含/etc/motd。
[xiaoshen@ssh-server ~]$ sudo less /etc/ssh/sshd_config | grep Banner
Banner /etc/issue
Banner /etc/motd
- 重新载入systemd配置,并重启sshd以应用修改。
[xiaoshen@ssh-server ~]$ sudo systemctl daemon-reload
[xiaoshen@ssh-server ~]$ sudo systemctl restart sshd
- 验证。
[xiaoshen@ssh-server ~]$ sudo systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-08-06 18:26:18 CST; 48s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 3056 (sshd)
Tasks: 1 (limit: 23645)
Memory: 1.1M
CGroup: /system.slice/sshd.service
└─3056 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh>
Aug 06 18:26:18 ssh-server systemd[1]: Starting OpenSSH server daemon...
Aug 06 18:26:18 ssh-server sshd[3056]: Server listening on 0.0.0.0 port 22.
Aug 06 18:26:18 ssh-server sshd[3056]: Server listening on :: port 22.
Aug 06 18:26:18 ssh-server systemd[1]: Started OpenSSH server daemon.
- 使用SSH客户端连接到SSH服务器。
[student@controller ~]$ ssh xiaoshen@ssh-server
Welcome to ssh-server host.
xiaoshen@ssh-server's password:
Login Successful!
......
生成SSH密钥对
在本地系统中生成SSH密钥对,并将生成的公钥复制到OpenSS服务器中。注意:请以要使用密钥远程登录的用户操作,不要使用root用户生成密钥对,然后使用其他用户登录是不可以,错误的操作。
流程
:
- 为SSH协议的版本2生成ECDSA密钥对。
[xiaoshen@serverb ~]$ ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/xiaoshen/.ssh/id_ecdsa):
Created directory '/home/xiaoshen/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/xiaoshen/.ssh/id_ecdsa.
Your public key has been saved in /home/xiaoshen/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:QwH1R1VGmfBUNJixv3pyyTzUeoeiT7dU8isalRn4P2I xiaoshen@serverb.lab.example.com
The key's randomart image is:
+---[ECDSA 256]---+
| .oo .+**X|
| o ..o++.|
| . ...o . |
| . .. = |
| S =..o|
| . . .=o|
| ..E**o|
| .+==O=|
| .+oo*oo|
+----[SHA256]-----+
- 将公钥复制到远程机器中。
[xiaoshen@serverb ~]$ ssh-copy-id xiaoshen@ssh-server
......
Welcome to ssh-server host.
xiaoshen@ssh-server's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'xiaoshen@ssh-server'"
and check to make sure that only the key(s) you wanted were added.
如果重新安装系统希望保留之前用户生成的密钥对,值需要备份
/.ssh
目录,重新安装后,将其复制到主目录中即可,可以为系统中所有用户执行此操作,包括root。
设置只基于密钥的身份验证
要提高系统安全性,通过在OpenSSH服务器上禁用密码身份验证来强制进行基于密钥的身份验证。
流程:
-
在文本编辑器中打开/etc/ssh/sshd_config配置,将
PasswordAuthentication
选项设置为
no
。(注意:如果是要进行远程连接,而不是使用控制台或带外访问,在禁用密码验证前,请先实现基于密钥的登录。)
[xiaoshen@ssh-server ~]$ sudo vim /etc/ssh/sshd_config
PasswordAuthentication no
默认安装以外或者是新安装的的系统中,检查PubkeyAuthentication已被注释(#);并且将ChallengeResponseAuthentication指令设为no。
#PubkeyAuthentication yes
ChallengeResponseAuthentication no
- 要在NFS挂载的主目录中使用基于密钥的验证,需启用use_nfs_home_dirs SELinuux布尔值。
[xiaoshen@ssh-server ~]$ sudo setsebool -P use_nfs_home_dirs 1
- 重新载入sshd守护进程以应用更改。
[xiaoshen@ssh-server ~]$ sudo systemctl reload sshd
- 验证:在不提供任何密码的情况下登录到OpenSSH服务器。
[xiaoshen@serverb ~]$ ssh xiaoshen@ssh-server
Welcome to ssh-server host.
Login Successful!
......
[xiaoshen@ssh-server ~]$
配置更安全的OpenSSH
-
禁止通过 ssh 直接以 root 身份登录。
[xiaoshen@serverb ~]$ sudo vim /etc/ssh/sshd_config ... PermitRootLogin prohibit-password ...... [xiaoshen@serverb ~]$ sudo systemctl reload sshd
-
启用基于密钥的身份验证并禁用基于密码的身份验证。
[xiaoshen@serverb ~]$ sudo vim /etc/ssh/sshd_config ... PasswordAuthentication no ...... [xiaoshen@serverb ~]$ sudo systemctl reload sshd
-
限制对特定用户、组群或者域的访问
/etc/ssh/sshd_config配置文件中的AllowUsers和AllowGroups指令可以只允许某些用户、域或组连接到您的OpenSSH服务器。
[xiaoshen@serverb ~]$ sudo vim /etc/ssh/sshd_config ... AllowUsers *@192.168.1.*,*@172.25.192.*,!*@192.168.1.233 AllowGroups example-group ......
接受来自192.168.1.* 和172.25.192.* 子网中所有用户的连接,但192.168.1.233地址的系统除外。所有用户都必须在example-group组中。
-
使用非默认端口
默认情况下sshd守护进程侦听TCP端口22。更改此端口可降低系统因自动网络扫描而收到攻击的风险,并可以提高安全性。
[xiaoshen@serverb ~]$ sudo semanage port -a -t ssh_port_t -p tcp PORT_NUMBER [xiaoshen@serverb ~]$ sudo firewall-cmd --add--port PORT_NUMBER/tcp [xiaoshen@serverb ~]$ sudo firewall-cmd --runtime-to-permanent
-
使用更安全的密钥类型
ssh-keygen命令默认生成一组RSA密钥,使用-t选项可以指定它生成ECDSA或者Ed25519密钥。
ECDSA(Eliptic Curve Digital Signature Algorithm)能够在同等的对称密钥强度下,提供比RSA更好的性能。还会生成较短的密钥。
Ed25519公钥算法是一种变形的Edwards曲线的实现,比RSA、DSA和ECDSA更安全,也更快。
- 使用sshd_keygen@.service实例化服务,禁用自动创建RSA密钥类型。
[xiaoshen@serverb ~]$ sudo systemctl mask sshd-keygen@rsa.service
- 注释/etc/ssh/sshd_confing中的相关行,排除SSH连接的特定密钥类型,只允许Ed25519主机密钥,并重新载入sshd服务。
[xiaoshen@serverb ~]$ sudo vim /etc/ssh/sshd_config
...
# HostKey /etc/ssh/ssh_host_rsa_key
# HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
......
[xiaoshen@serverb ~]$ sudo systemctl reload sshd
- 生成SSH密钥对。