SSH访问远程系统

  • Post author:
  • Post category:其他


简介: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服务器。


先决条件

  1. 查看系统中是否已经安装openssh-server软件包。
[xiaoshen@ssh-server ~]$ rpm -qa openssh-server
openssh-server-8.0p1-13.el8.x86_64
  1. 如果没有安装,请执行以下命令安装openssh-server。
[xiaoshen@ssh-server ~]$ sudo dnf install openssh-server

流程

  1. 在当前系统会话中启动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)
...
  1. 改变客户端登录验证前和登录后验证后后的欢迎信息。(可选)


登录前

[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
  1. 重新载入systemd配置,并重启sshd以应用修改。
[xiaoshen@ssh-server ~]$ sudo systemctl daemon-reload
[xiaoshen@ssh-server ~]$ sudo systemctl restart sshd
  1. 验证。
[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.
  1. 使用SSH客户端连接到SSH服务器。
[student@controller ~]$ ssh xiaoshen@ssh-server
Welcome to ssh-server host.
xiaoshen@ssh-server's password:
Login Successful!
......



生成SSH密钥对

在本地系统中生成SSH密钥对,并将生成的公钥复制到OpenSS服务器中。注意:请以要使用密钥远程登录的用户操作,不要使用root用户生成密钥对,然后使用其他用户登录是不可以,错误的操作。


流程

  1. 为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]-----+
  1. 将公钥复制到远程机器中。
[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服务器上禁用密码身份验证来强制进行基于密钥的身份验证。


流程:

  1. 在文本编辑器中打开/etc/ssh/sshd_config配置,将

    PasswordAuthentication

    选项设置为

    no

    。(注意:如果是要进行远程连接,而不是使用控制台或带外访问,在禁用密码验证前,请先实现基于密钥的登录。)
[xiaoshen@ssh-server ~]$ sudo vim /etc/ssh/sshd_config
PasswordAuthentication no

默认安装以外或者是新安装的的系统中,检查PubkeyAuthentication已被注释(#);并且将ChallengeResponseAuthentication指令设为no。

#PubkeyAuthentication yes

ChallengeResponseAuthentication no
  1. 要在NFS挂载的主目录中使用基于密钥的验证,需启用use_nfs_home_dirs SELinuux布尔值。
[xiaoshen@ssh-server ~]$ sudo setsebool -P use_nfs_home_dirs 1
  1. 重新载入sshd守护进程以应用更改。
[xiaoshen@ssh-server ~]$ sudo systemctl reload sshd
  1. 验证:在不提供任何密码的情况下登录到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更安全,也更快。

  1. 使用sshd_keygen@.service实例化服务,禁用自动创建RSA密钥类型。
[xiaoshen@serverb ~]$ sudo systemctl mask sshd-keygen@rsa.service
  1. 注释/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
  1. 生成SSH密钥对。



版权声明:本文为YSEasi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。