如何在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
sudo apt update
sudo apt install openssh-client openssh-server
sudo apt update sudo apt install openssh-client openssh-server

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

sudo yum install openssh-clients openssh-server
sudo yum install openssh-clients openssh-server
sudo yum install openssh-clients openssh-server

使用ssh-keygen生成密钥对

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

命令的基本用法如下:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
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"
ssh-keygen -t rsa -b 4096 -f /path/to/your/keys/my_key -C "your_email@example.com"
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)"
eval "$(ssh-agent -s)"
eval "$(ssh-agent -s)"

2、添加私钥到代理:

ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa

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

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

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

配置SSH服务器

登录到目标服务器

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

ssh username@your_server_ip
ssh username@your_server_ip
ssh username@your_server_ip

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

手动安装公钥

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

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

cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub

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

nano ~/.ssh/authorized_keys
nano ~/.ssh/authorized_keys
nano ~/.ssh/authorized_keys

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

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

ssh username@your_server_ip
ssh username@your_server_ip
ssh username@your_server_ip

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

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

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

ssh-copy-id username@your_server_ip
ssh-copy-id username@your_server_ip
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
touch ~/.ssh/config
touch ~/.ssh/config

编辑 ~/.ssh/config 文件:

nano ~/.ssh/config
nano ~/.ssh/config
nano ~/.ssh/config

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

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

以下是一个简单的例子:

Host example
HostName your_server_ip
User username
Port 2222
IdentityFile ~/.ssh/id_rsa
Host example
    HostName your_server_ip
    User username
    Port 2222
    IdentityFile ~/.ssh/id_rsa
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
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
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
sudo nano /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config

2、找到并修改以下行:

PasswordAuthentication no
PasswordAuthentication no
PasswordAuthentication no

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

sudo service ssh restart
sudo service ssh restart
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
AllowUsers alice bob
DenyUsers mallory
AllowGroups sshusers
DenyGroups badusers
PermitRootLogin no
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
PasswordAuthentication no
PasswordAuthentication no

然后重新启动 SSH 服务:

sudo service ssh restart
sudo service ssh restart
sudo service ssh restart

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

使用sshd_config文件设置访问限制

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

打开 /etc/ssh/sshd_config 文件:

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

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

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

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

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

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

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

sudo service ssh restart
sudo service ssh restart
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
sshd: 192.168.1.0/255.255.255.0
sshd: 192.168.1.0/255.255.255.0

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

限制和加固SSH访问

禁用密码身份验证

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

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

sudo nano /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config

找到并修改以下行:

PasswordAuthentication no
PasswordAuthentication no
PasswordAuthentication no

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

sudo service ssh restart
sudo service ssh restart
sudo service ssh restart

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

使用sshd_config文件设置访问限制

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

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

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

修改SSH端口

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

Port 2222
Port 2222
Port 2222

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

使用SSH Agent Forwarding

什么是SSH Agent Forwarding

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

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

配置和使用SSH Agent Forwarding

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

eval "$(ssh-agent -s)"
eval "$(ssh-agent -s)"
eval "$(ssh-agent -s)"

2、添加私钥到代理:

ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa

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

ssh -A username@your_server_ip
ssh -A username@your_server_ip
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
sudo apt-get install libpam-google-authenticator
sudo apt-get install libpam-google-authenticator

2、修改 PAM 配置文件:

sudo nano /etc/pam.d/sshd
sudo nano /etc/pam.d/sshd
sudo nano /etc/pam.d/sshd

在文件末尾添加以下行:

auth required pam_google_authenticator.so
auth required pam_google_authenticator.so
auth required pam_google_authenticator.so

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

sudo nano /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config

确保以下行的值为 yes

ChallengeResponseAuthentication yes
ChallengeResponseAuthentication yes
ChallengeResponseAuthentication yes

4、重启SSH服务:

sudo service ssh restart
sudo service ssh restart
sudo service ssh restart

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

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

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

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

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

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

sudo nano /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config

确保以下行的值为 yes

PubkeyAuthentication yes
AuthenticationMethods publickey,password publickey,publickey
PubkeyAuthentication yes
AuthenticationMethods publickey,password publickey,publickey
PubkeyAuthentication yes AuthenticationMethods publickey,password publickey,publickey

4、重启SSH服务:

sudo service ssh restart
sudo service ssh restart
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-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-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
# 安装 fail2ban
sudo apt install fail2ban   # 对于 Debian/Ubuntu
sudo yum install fail2ban   # 对于 Red Hat/CentOS

# 启用 SSH 防护
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 安装 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
sudo tail -f /var/log/auth.log   # 对于 Debian/Ubuntu
sudo tail -f /var/log/secure     # 对于 Red Hat/CentOS
sudo tail -f /var/log/auth.log # 对于 Debian/Ubuntu sudo tail -f /var/log/secure # 对于 Red Hat/CentOS

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

© 版权声明
THE END