如何在 Linux 上设置 SSH 密钥身份验证?
nanshan 2024-10-29 14:46 9 浏览 0 评论
在计算机网络中,SSH(Secure Shell)是一种加密的网络协议,广泛用于在不安全的网络上安全地运行网络服务。SSH 提供了加密的通信和身份验证的方法,使得数据传输变得更加安全可靠。其中,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 操作无需再次输入密码。
- 启动 SSH 代理:
eval "$(ssh-agent -s)"
- 添加私钥到代理:
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 文件中。
- 将本地公钥内容复制到剪贴板:
cat ~/.ssh/id_rsa.pub
- 在目标服务器上,使用文本编辑器打开 ~/.ssh/authorized_keys 文件:
nano ~/.ssh/authorized_keys
- 将剪贴板上的公钥内容粘贴到文件末尾,并保存文件。
- 回到本地机器,尝试使用密钥身份验证登录:
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 中禁用密码身份验证:
- 打开 sshd_config 文件:
sudo nano /etc/ssh/sshd_config
- 找到并修改以下行:
PasswordAuthentication no
- 保存文件并重新启动 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
- 在本地机器上启动 SSH Agent:
eval "$(ssh-agent -s)"
- 添加私钥到代理:
ssh-add ~/.ssh/id_rsa
- 在连接到远程主机时启用 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
- 安装并配置 MFA 工具(如 Google Authenticator):
sudo apt-get install libpam-google-authenticator
- 修改 PAM 配置文件:
sudo nano /etc/pam.d/sshd
在文件末尾添加以下行:
auth required pam_google_authenticator.so
- 修改 SSH 配置文件,启用 ChallengeResponseAuthentication:
sudo nano /etc/ssh/sshd_config
确保以下行的值为 yes:
ChallengeResponseAuthentication yes
- 重启 SSH 服务:
sudo service ssh restart
结合硬件密钥和手机应用的 MFA
除了基于软件的 MFA(如手机应用生成的验证码),你还可以考虑结合硬件密钥,如 YubiKey 或其他支持 U2F 标准的硬件令牌。
- 在本地机器上配置硬件密钥:
ssh-keygen -t ecdsa-sk -f ~/.ssh/id_ecdsa_sk
- 将生成的公钥添加到 SSH 服务器上的 ~/.ssh/authorized_keys。
- 修改 SSH 配置文件,启用硬件密钥认证:
sudo nano /etc/ssh/sshd_config
确保以下行的值为 yes:
PubkeyAuthentication yes
AuthenticationMethods publickey,password publickey,publickey
- 重启 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 访问,你可以及时发现异常情况,并采取相应的措施来保护系统安全。
相关推荐
- Linux 的磁盘系统,和你了解的Windows差别很大
-
我的C盘去哪了?一个系统,如果没有存储,那么也就不能称之为系统。存储性是一个完整系统的重要组成部分。例如AWS最开始的服务就是S3(用来存储数据的云服务),足以见得存储对于一个应用平台是多么的重要。...
- 一文读懂 Linux 硬盘挂载:从问题到解决方案
-
各位互联网大厂的后端开发伙伴们!在咱们日常工作中,操作Linux系统是常有的事儿吧。你们有没有遇到过这样的场景:新添加了一块硬盘,满心欢喜准备用来存储重要数据或者部署新的应用服务,却突然发现不知道...
- 硬盘分区(硬盘分区格式)
-
磁盘(硬盘)分区,可以分C、D、E等分区,大家可能都会用,会根据自已的需要确定所需的空间,但分区是如何工作的呢,内容如下。Windows中有3类:MBR分区:MasterBootRecord,也...
- parted命令工具分区介绍(particle命令)
-
linux系统磁盘分区通常可以使用fdisk和parted命令,当分区大小小于2TB的时候,两种皆可以使用,当分区大于2TB的话,就需要用parted分区。以下介绍parted命令相关使用,以sdb为...
- Linux 服务器上查看磁盘类型的方法
-
方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。NAME列显示设备名称(如sda、nvme0n1)。TR...
- Linux分区命令fdisk和parted使用介绍
-
摘要:一般情况下,Linux分区都是选择fdisk工具,要求硬盘格式为MBR格式,能支持的最大分区空间为2T。但是目前在实际生产环境中使用的磁盘空间越来越大,呈TB级别增长;而常用的fdisk这个工具...
- linux 分区原理与名词解释(linux操作系统中的分区类型)
-
分区的意义将磁盘分成几份,每份挂在到文件系统的那个目录在linux里的文件系统Ext2:早期的格式,不支持日志功能Ext3:ext2改良版,增加了日志功能,是最基本且最常用的使用格式了Ext4:针对e...
- linux 分区合并(linux合理分区)
-
查看虚拟机当前磁盘挂载情况fdisk-l选择磁盘fdisk/dev/sda查看磁盘分区情况p重新选择分区n选择主分区p保存w创建物理卷pvcreate/dev/sda3查看物理卷信息pvdi...
- 如何在 Linux 系统中永久禁用交换分区 ?
-
Linux操作系统中的交换分区或交换文件充当硬盘上的临时存储区域,当物理内存(RAM)满时,系统使用该存储区域。它用于交换较少使用的内存页,这样系统就不会因为运行应用程序而耗尽物理内存。随着技术的发...
- Linux 如何知道硬盘已用多少空间、未用多少空间
-
刚出社会时,去了一家公司上班,老板为了省钱,买的服务器是低配的,硬盘大小只有40G,有一次网站突然不能访问了,排查半天才知道原来服务器的硬盘空间已用完,已无可用空间。第一步是查看硬盘的使用情况,第二步...
- 用Linux系统管理磁盘空间 就该这么来
-
要想充分有效的管理使用Linux系统中的存储空间,用户必须要做的就是双管齐下,一边扩充空间一边限制空间。不得不说的就是很多时候磁盘空间就像水资源,需节制水流。说到要如何实现限制空间就离不开使用LVM技...
- Windows 11 磁盘怎么分区?(windows11磁盘怎么分区)
-
Windows11磁盘分区技术解析与操作指南:构建高效存储体系一、磁盘分区的技术本质与系统价值磁盘分区作为存储系统的基础架构,通过逻辑划分实现数据隔离与管理优化。Windows11采用NTF...
- linux上创建多个文件分区,格式化为 ext2、ext3、ext4、XFS 文件
-
以下是在Linux系统上创建多个20GB文件分区并格式化为不同文件系统的分步指南:步骤1:创建基础文件(4个20GB文件)bash#创建4个20GB稀疏文件(实际占用空间随写入量增长)ddif=/...
- 救命的U盘低格哪家最强?(低格优盘)
-
周二时有位童鞋留言说U盘之前做过引导盘,现在格式化不了,用各种工具都不行,而且因为U盘厂商的关系,查不到U盘主控,无法量产恢复,特来求助。小编花了点时间特意弄坏一个U盘分区,终于试出方法了,特来分享一...
- Linux 查看硬件磁盘存储大小和磁盘阵列(RAID)的组合方式
-
一、查看硬件磁盘存储大小查看所有磁盘信息:#lsblk该命令会列出所有磁盘(如/dev/sda、/dev/nvme0n1)及其分区和挂载点。查看磁盘总容量:fdisk-l#或parted-...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
手机如何设置与显示准确时间的详细指南
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
一加手机与电脑互传文件的便捷方法FileDash
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)