每天进步一点点:使用密钥登录远程SSH账户(Linux版)

in voilk •  11 days ago

    关于是使用密钥登录远程ssh账户还是使用密码登录,网络上众说纷纭;支持密钥的一方主要理由是使用密钥安全性更高而且支持自动化操作;支持密码的一方,无论何时何地,只要记着密码就能登录服务器。

    image.png
    (图源 :pixabay)

    我是倾向于使用密钥管理服务器的,但是很多时候我常用的几台服务器我又是使用密码来管理的,这做人做的还真有些拧巴。

    今天先不去辩论两种方式的优越点,今天来详细整理一下如何使用密钥来登录远程账户。

    为了便于测试,我在远程服务器上创建了新用户testuser1,这名字很Nice吧?之后的操作都在本地主机完成。

    生成公私钥对

    使用密钥登录SSH,我们需要一组密钥对,其中公钥用于身份验证,而私钥用来进行加密。

    在本地主机上,我们可以使用如下指令生成公私钥对:

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

    其中:

    ssh-keygen是用于生成密钥对的指令
    -t rsa表示使用RSA算法生成密钥对
    -b 4096指定生成密钥的位数为4096,位数越高安全性越好
    -C "your_email@example.com" 注释部分,用来标识密钥

    执行 ssh-keygen 命令后会被提示密钥的存储路径:
    1735479796741.png

    以及选择是否为密钥设置密码等操作:
    1735479855792.png
    (这个是保护私钥的密码,并非远程SSH账户密码哦)

    之后成功生成了密钥对:
    1735480875968.png

    上传公钥至远程SSH账户

    在使用密钥登录远程SSH账户之前,我们首先需要将公钥复制到(确切地说叫追加到)远程服务器的 ~/.ssh/authorized_keys 文件中。

    Linux下可以使用如下指令:

    ssh-copy-id -i ~/.ssh/id_rsa.pub testuser1@x.x.x.x

    执行后会提示如下信息:
    1735481556875.png

    输入远程主机的登录密码,公钥就会被成功安装至远程主机对应账户:
    1735481647113.png

    测试登录远程主机

    添加完公钥以后,ssh-copy-id已经提示我们去测试一下登录啦:

    ssh 'testuser1@x.x.x.x'

    那就复制指令,登录一下呗:
    1735481905172.png

    因为我们之前生成密钥对时为私钥设置了密码保护私钥,所以登录时要校验一下密码(双重安全防护)。

    接下来就没啥悬念了,成功登录。

    对指定账户设置规则

    好,现在我们已经完成了使用密钥登录SSH账户的全过程,不用再输入繁琐的密码了(私钥保护密码可以弄个不太复杂的,毕竟是二重保护)。

    但是问题来了,现在我既可以使用密钥登录,又可以使用密码登录,这貌似和我们避免密码登录的初衷不符啊。

    那么如何禁用密码登录呢,一般来讲有两种策略:一是全局禁用密码登录;二是仅禁用相应用户的密码登录。

    全局禁用密码登录和仅禁用相应用户的密码登录,都需要操作者有管理员的权限,然后编辑sshd_config文件:

    sudo vi /etc/ssh/sshd_config

    在文件末尾追加如下内容:
    1735533276274.png

    文字版(方便复制粘贴):

    Match User testuser1
        PasswordAuthentication no
        ChallengeResponseAuthentication no
    

    以上内容仅针对testuser1

    如果你要针对所有用户禁用密码登录,则修改sshd_config中对应条目的值,改成和上述值相同即可。

    为了使设置生效,我们需要执行如下指令:

    sudo systemctl restart ssh

    这时我们再尝试使用非密钥登录,比如使用Putty从Windows下登录:
    1735534157101.png

    就会出现如下提示:
    1735534213685.png

    说明我们的设置生效啦。

    多个密钥的问题

    假设我们在本地Linux账户下使用多个密钥登录多台不同的服务器(咦,应该也可以用同一个密钥对),那么系统是如何识别该用哪个密钥呢?

    一种方式是,我们可以手工指定要用的密钥:

    ssh -i ~/.ssh/id_rsa_server1 testuser1@x.x.x.x

    如果不指定密钥,又会是什么样子呢?据我了解到的信息:

    SSH 客户端默认会按照配置文件中或者默认密钥路径下的密钥进行尝试,直到找到一个能匹配目标服务器公钥的私钥为止。

    当然,更优雅的方式是,在本地主机账户下的~/.ssh/config为每个服务器指定相应的密钥文件:

    Host server1
        HostName server1.example.com
        User user123
        IdentityFile ~/.ssh/id_rsa_server1
    
    Host server2
        HostName server2.example.com
        User user456
        IdentityFile ~/.ssh/id_rsa_server2
    

    好了,今天暂时就学习到这里了。

    你学废了嘛?没学废的,改天我们继续学习!😀

      Authors get paid when people like you upvote their post.
      If you enjoyed what you read here, create your account today and start earning FREE VOILK!