如何在Linux系统中设置SSH密钥身份验证

SSH(Secure Shell)是一种加密的网络协议,广泛的应用在不安全的网络上安全地运行网络服务。

SSH提供了加密的通信和身份验证的方法,这会让数据传输变得更加安全可靠。

其中,SSH密钥身份验证是一种更安全的身份验证方式,它相较于传统的密码身份验证不念更为推荐。

密码身份验证在很多情况下是不够安全的,因为密码可能会被猜测、被破解,甚至在传输过程中被中间人攻击威胁。

而密钥身份验证是通过使用公钥和私钥的组合,这大大增加了安全性。

私钥存储在用户本地,而公钥则被放置在远程服务器上,这种组合使得攻击者即使截获了公钥,也难以逆向推导出私钥,从而提供了更加安全的身份验证手段。

图片[1]-如何在Linux系统中设置SSH密钥身份验证-不念博客

生成SSH密钥对

首先,需要确保你的Linux系统上已经安装了OpenSSH工具。

因为大多数Linux发行版都默认安装了这个工具,如果你的系统上没有安装,你也可以使用包管理器来安装它。

在Debian/Ubuntu上使用apt安装OpenSSH:

sudo apt update
sudo apt install openssh-client openssh-server

在Red Hat/CentOS上使用yum安装OpenSSH:

sudo yum install openssh-clients openssh-server

使用ssh-keygen生成密钥对

一旦安装了OpenSSH,你就可以使用ssh-keygen命令生成SSH密钥对。

命令的基本用法如下:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • -t rsa 指定密钥类型为 RSA。
  • -b 4096 指定密钥长度为 4096 比特,提高安全性。
  • -C "your_email@example.com" 添加注释,一般用你的邮箱地址。

生成密钥对后,你可以选择将其存储在默认位置(~/.ssh/ 目录下)或选择其他位置。

生成的密钥对包括两个文件:私钥文件(id_rsa)和公钥文件(id_rsa.pub)。私钥文件存储在本地,而公钥文件则需要被复制到远程服务器上。

私钥是敏感信息,必须妥善保存。公钥则是用于身份验证的公开信息。

密钥的存储和管理

默认情况下,生成的 SSH 密钥对会存储在用户的 ~/.ssh/ 目录下。这个目录包含了两个主要文件:id_rsa(私钥)和 id_rsa.pub(公钥)。这种设置是为了方便用户在使用 SSH 时能够轻松找到和管理密钥。

然而,有时出于安全或组织的考虑,你可能想要将密钥存储在其他位置。这可以通过在生成密钥对时指定存储路径来实现。

例如:

ssh-keygen -t rsa -b 4096 -f /path/to/your/keys/my_key -C "your_email@example.com"

这样会将私钥存储为 /path/to/your/keys/my_key,公钥存储为 /path/to/your/keys/my_key.pub

SSH 密钥代理是一个可以管理 SSH 私钥的程序,可以在一次登录后将私钥的解密密码缓存起来,以便后续的 SSH 操作无需再次输入密码。

1、启动 SSH 代理:

eval "$(ssh-agent -s)"

2、添加私钥到代理:

ssh-add ~/.ssh/id_rsa

这样,你就不需要每次 SSH 登录都输入私钥密码了,提高了使用的便利性和安全性。

在实际使用中,你可能会有多个密钥对,用于不同的服务器或用途。

为了更好地管理这些密钥对,可以使用 SSH 配置文件或密钥文件的别名。

配置SSH服务器

登录到目标服务器

在你能够使用 SSH 密钥身份验证登录到目标服务器之前,确保目标服务器上已经启用了 SSH 服务。在大多数 Linux 系统中,默认情况下,SSH 服务是启动的。

ssh username@your_server_ip

确保替换 username 为你的用户名,your_server_ip 为目标服务器的 IP 地址。这将尝试使用默认的密码身份验证登录。

手动安装公钥

手动安装公钥是一种基本的方法,它涉及将你的公钥内容添加到目标服务器上的 ~/.ssh/authorized_keys 文件中。

1、将本地公钥内容复制到剪贴板:

cat ~/.ssh/id_rsa.pub

2、在目标服务器上,使用文本编辑器打开 ~/.ssh/authorized_keys 文件:

nano ~/.ssh/authorized_keys

3、将剪贴板上的公钥内容粘贴到文件末尾,并保存文件。

4、回到本地机器,尝试使用密钥身份验证登录:

ssh username@your_server_ip

通过ssh-copy-id简化公钥部署

ssh-copy-id 命令可以简化将本地公钥复制到远程服务器的过程。

这个命令会自动处理将公钥添加到目标服务器的 ~/.ssh/authorized_keys 文件中。

ssh-copy-id username@your_server_ip

确保替换 username 为你的用户名,your_server_ip 为目标服务器的 IP 地址。这个命令将提示你输入用户密码,然后将本地公钥复制到目标服务器上。

通过这两种方法,你可以在目标服务器上配置 SSH 密钥身份验证,提高登录的安全性和便利性。

SSH 配置文件详解

~/.ssh/config 文件的作用和结构

~/.ssh/config 文件是一个用于配置 SSH 客户端行为的配置文件。

它允许你为不同的主机设置自定义的配置选项,从而简化 SSH 连接的管理。

创建 ~/.ssh/config 文件:

touch ~/.ssh/config

编辑 ~/.ssh/config 文件:

nano ~/.ssh/config

使用别名、端口号等配置项简化SSH连接

配置文件中可以包含多个主机条目,每个条目定义了连接到远程主机的配置选项。

以下是一个简单的例子:

Host example
    HostName your_server_ip
    User username
    Port 2222
    IdentityFile ~/.ssh/id_rsa
  • Host:设置别名,用于代替实际的主机名。
  • HostName:远程主机的 IP 地址或域名。
  • User:连接时使用的用户名。
  • Port:SSH 连接的端口号。
  • IdentityFile:指定用于身份验证的私钥文件路径。

实际场景中的示例配置文件

以下是一个更为复杂的 ~/.ssh/config 文件,涵盖了多个主机和配置选项:

Host work
    HostName work.example.com
    User alice
    Port 22
    IdentityFile ~/.ssh/work_key

Host personal
    HostName personal.example.org
    User bob
    Port 2222
    IdentityFile ~/.ssh/personal_key

Host github
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_key

这样,你只需要使用别名就能够轻松连接到相应的主机,而不必记住每个主机的详细信息。

限制和加固SSH访问

禁用密码身份验证

禁用密码身份验证是提高 SSH 安全性的重要步骤之一。

这样,用户只能通过密钥身份验证进行访问,而不再依赖弱密码。

sshd_config中禁用密码身份验证:

1、打开 sshd_config 文件:

sudo nano /etc/ssh/sshd_config

2、找到并修改以下行:

PasswordAuthentication no

3、保存文件并重新启动 SSH 服务:

sudo service ssh restart

使用sshd_config文件设置访问限制

sshd_config 文件包含了用于配置 SSH 服务器的各种选项。

通过适当配置,你可以限制用户访问、定义允许登录的用户、设置登录时的认证方式等。

一些常用的 sshd_config 选项:
  • AllowUsers:指定允许登录的用户列表。
  • DenyUsers:指定禁止登录的用户列表。
  • AllowGroups:指定允许登录的用户组列表。
  • DenyGroups:指定禁止登录的用户组列表。
  • PermitRootLogin:禁用或限制 root 用户的远程登录。
示例:
AllowUsers alice bob
DenyUsers mallory
AllowGroups sshusers
DenyGroups badusers
PermitRootLogin no

以上配置将只允许用户 alice 和 bob 以及属于 sshusers 组的用户登录,同时拒绝用户 mallory 和属于 badusers 组的用户登录。此外,禁止 root 用户通过 SSH 远程登录。

限制和加固SSH访问

禁用密码身份验证

为了提高 SSH 安全性,强烈建议禁用密码身份验证,仅使用密钥身份验证。

在 /etc/ssh/sshd_config 文件中找到并修改以下行:

PasswordAuthentication no

然后重新启动 SSH 服务:

sudo service ssh restart

这样配置后,只有拥有有效私钥的用户才能够进行 SSH 登录,大大增加了系统的安全性。

使用sshd_config文件设置访问限制

sshd_config 文件包含了 SSH 服务器的配置选项。通过修改这个文件,你可以设置一些限制,例如限制用户和 IP 地址的访问。

打开 /etc/ssh/sshd_config 文件:

sudo nano /etc/ssh/sshd_config
限制用户访问:
AllowUsers username

将 username 替换为允许访问的用户名。你还可以使用逗号分隔的列表允许多个用户。

限制IP地址访问:
AllowUsers username@your_ip

将 username 替换为允许访问的用户名,your_ip 替换为允许访问的 IP 地址。

允许特定IP地址段:
AllowUsers username@192.168.1.*

这样设置将允许来自 192.168.1 网段的所有 IP 地址的用户访问。

保存文件后,重新启动 SSH 服务:

sudo service ssh restart

使用TCP Wrappers进行进一步访问控制

在 /etc/hosts.allow 和 /etc/hosts.deny 文件中,你可以使用 TCP Wrappers 设置更复杂的主机访问控制规则。

例如,在 /etc/hosts.allow 中添加以下行:

sshd: 192.168.1.0/255.255.255.0

这样将允许来自 192.168.1 网段的所有主机访问 SSH 服务。

限制和加固SSH访问

禁用密码身份验证

禁用密码身份验证是提高 SSH 安全性的一种有效方法。通过仅允许使用密钥进行身份验证,可以防止恶意用户通过密码破解尝试来访问服务器。

在目标服务器上打开 sshd_config 文件:

sudo nano /etc/ssh/sshd_config

找到并修改以下行:

PasswordAuthentication no

保存文件并重新启动 SSH 服务:

sudo service ssh restart

此时,只有拥有合法私钥的用户才能成功进行 SSH 登录。

使用sshd_config文件设置访问限制

sshd_config 文件包含了配置 SSH 服务器行为的各种选项。通过修改这个文件,可以实现对访问的更精确控制。

sudo nano /etc/ssh/sshd_config
限制用户和IP地址
AllowUsers username@your_ip

这个配置将只允许指定用户从指定 IP 地址进行 SSH 登录。

修改SSH端口

默认情况下,SSH 服务使用 22 端口。为了提高安全性,可以修改为其他非常用端口,比如 2222:

Port 2222

确保保存修改并重新启动 SSH 服务。

使用SSH Agent Forwarding

什么是SSH Agent Forwarding

SSH Agent Forwarding 是一种机制,允许你在本地系统上解锁私钥,然后通过安全地转发到远程主机,以在远程主机上进行身份验证。

这意味着,如果你已经通过密钥身份验证登录到本地机器,你可以使用相同的身份验证在远程主机上执行操作,而无需再次输入密码或私钥。

配置和使用SSH Agent Forwarding

1、在本地机器上启动 SSH Agent:

eval "$(ssh-agent -s)"

2、添加私钥到代理:

ssh-add ~/.ssh/id_rsa

3、在连接到远程主机时启用 Agent Forwarding:

ssh -A username@your_server_ip

确保替换username为你的用户名,your_server_ip 为目标服务器的 IP 地址。

现在,你可以在远程主机上执行需要私钥身份验证的操作,而无需再次输入密码或私钥。

安全注意事项

尽管 SSH Agent Forwarding 提供了便利,但也需要注意一些安全性问题。确保遵循以下最佳实践:

  • 只允许受信任的主机使用 Agent Forwarding。 如果你连接到了不受信任的主机,可以通过使用 -A 参数禁用 Agent Forwarding。
  • 定期检查代理并清除不再需要的密钥。 使用 ssh-add -L 命令查看当前加载的密钥列表,并使用 ssh-add -D 清除不再需要的密钥。
  • 在不需要 Agent Forwarding 的情况下禁用它。 只有在确实需要在远程主机上执行私钥身份验证的操作时才启用 Agent Forwarding。

通过理解和正确配置 SSH Agent Forwarding,你可以在保持安全性的同时提高 SSH 的便利性。

多因素身份验证(MFA)

介绍多因素身份验证的重要性

多因素身份验证(MFA)是一种安全措施,要求用户在登录时提供两个或多个独立的身份验证因素,以验证其身份。

通常,这包括“知道的事项”(如密码)和“拥有的物件”(如手机或硬件令牌)。

配置和使用基于密钥的MFA

1、安装并配置 MFA 工具(如 Google Authenticator):

sudo apt-get install libpam-google-authenticator

2、修改 PAM 配置文件:

sudo nano /etc/pam.d/sshd

在文件末尾添加以下行:

auth required pam_google_authenticator.so

3、修改SSH配置文件,启用 ChallengeResponseAuthentication:

sudo nano /etc/ssh/sshd_config

确保以下行的值为 yes

ChallengeResponseAuthentication yes

4、重启SSH服务:

sudo service ssh restart

结合硬件密钥和手机应用的MFA

除了基于软件的 MFA(如手机应用生成的验证码),你还可以考虑结合硬件密钥,如 YubiKey 或其他支持 U2F 标准的硬件令牌。

1、在本地机器上配置硬件密钥:

ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk

2、将生成的公钥添加到 SSH 服务器上的 ~/.ssh/authorized_keys

3、修改SSH配置文件,启用硬件密钥认证:

sudo nano /etc/ssh/sshd_config

确保以下行的值为 yes

PubkeyAuthentication yes
AuthenticationMethods publickey,password publickey,publickey

4、重启SSH服务:

sudo service ssh restart

通过结合不同因素的身份验证,你大大提高了服务器的安全性。

定期更新密钥对

为了增加安全性,定期更新 SSH 密钥对是一个好的实践。

可以使用以下步骤生成新的密钥对并替换旧的密钥:

# 生成新的密钥对
ssh-keygen -t rsa -b 4096 -f ~/.ssh/new_key -C "your_email@example.com"

# 复制新的公钥到目标服务器
ssh-copy-id username@your_server_ip -i ~/.ssh/new_key.pub

# 测试新密钥是否可以成功登录
ssh -i ~/.ssh/new_key username@your_server_ip

# 如果一切正常,可以删除旧密钥
rm ~/.ssh/id_rsa*

监控和审计SSH访问

启用 SSH 访问的监控和审计功能可以及时发现潜在的安全问题。

可以使用工具如 fail2ban 来监控日志文件,自动封禁恶意的 SSH 连接尝试。

# 安装 fail2ban
sudo apt install fail2ban   # 对于 Debian/Ubuntu
sudo yum install fail2ban   # 对于 Red Hat/CentOS

# 启用 SSH 防护
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

通过审查系统日志文件,特别是 /var/log/auth.log(对于 Debian/Ubuntu)或 /var/log/secure(对于 Red Hat/CentOS),可以查看 SSH 访问的详细信息。

sudo tail -f /var/log/auth.log   # 对于 Debian/Ubuntu
sudo tail -f /var/log/secure     # 对于 Red Hat/CentOS

通过监控和审计SSH访问,你可以及时发现异常情况,并采取相应的措施来保护系统安全。

© 版权声明
THE END