zoukankan      html  css  js  c++  java
  • [转] SSH 密钥认证机制

    使用 RSA 密钥对进行 SSH 登录验证

    使用 RSA 密钥对验证 SSH 的优点是 1) 不用打密码 2) 比密码验证更安全;缺点是 1) 第一次配置的时候有点麻烦 2) 私钥需要小心保存。Anyway 用密钥验证比密码验证还是方便不少的。推荐所有用户使用密钥认证。

     

    1. 生成密钥对

    OpenSSH 提供了ssh-keygen用于生成密钥对,不加任何参数调用即可:

     

     

    % ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/xiaq/.ssh/id_rsa): 

    如果你以前没有生成过密钥对,直接回车就行。然后会问你“passphrase”,这是用来加密私钥的密码。如果你不知道怎么用,直接用空密码也行(当然,这样会降低安全性)。按两次回车后密钥对就生成好了:

     

     

    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/xiaq/.ssh/id_rsa.2.
    Your public key has been saved in /home/xiaq/.ssh/id_rsa.2.pub.
    The key fingerprint is:
    8a:77:ec:a1:77:42:8d:5d:ab:17:33:ac:87:06:20:3c xiaq@blackie
    The key's randomart image is:
    +--[ RSA 2048]----+
    |                 |
    |                 |
    |   .             |
    |    E .     .    |
    |     o .S+ o .   |
    |     . o+ o *    |
    |    . o.+. + +   |
    |     . +o.* o    |
    |      ...+ o     |
    +-----------------+

    嗯,会有一堆很花哨的输出,可以全都不管。这样在你刚才指定的地方就有了一对密钥,其中私钥就是上面指定的名字,公钥则多一个“.pub”后缀。

     

    不要把你的私钥和任何人分享。公钥可以到处分发。

     

    2. 上传密钥

    把你的公钥用scp上传到了远程远程ssh服务器,并把公钥的内容追加到ssh服务器的 ~/.ssh/authorized_keys:

     

     

    % scp ~/.ssh/id_rsa.pub user@host:
    % ssh user@host
    % cat id_rsa.pub >> ~/.ssh/authorized_keys

    或者等价地

     

     

    % cat ~/.ssh/id_rsa.pub | ssh user@host 'cat >> ~/.ssh/authorized_keys'

    COMMENT: 顾名思义,authorized_keys 里面可以存多个公钥。所以在这里用 cat id_rsa.pub >> ~/.ssh/authorized_keys。不过,如果你以前没有这个文件,直接 cp id_rsa.pub ~/.ssh/authorized_keys 也是可以的……

    如果你的 ~ 下没有 .ssh 目录,建立之即可。

    NOTE: OpenSSH 提供了一个脚本ssh-copy-id用于上传公钥。其作用就是自动化完成以上的操作,例如在自己的机器上执行

     

    $ ssh-copy-id -i .ssh/id_rsa.pub user@remoteserver.com

    man ssh-copy-id完整语法 ssh-copy-id [-i public_key] [user@]machine

     

    3. ~/.ssh 相关文件权限

    为防止你的私钥被恶意用户获取和/或篡改,以及你的公钥信息被恶意用户篡改,ssh 对 ~/.ssh 的文件权限有着严格的要求。如果权限不对,公钥验证不会正常工作。

    NOTE: 准确说来,这取决于 sshd 的配置。但不管怎样,出于安全性考虑,按如下步骤配置文件权限还是必要的。

    在本地和远程两台机器上,都确认 ~/.ssh 目录只有你有 rwx 权限,其他人没有任何权限:

     

    % pwd
    /home/xiaq
    % chmod 700 .ssh
    % ls -dl .ssh
    drwx------ 2 xiaq xiaq 4096 Jun  6 11:29 .ssh/

    在本地机器上,确认私钥只有你有 rw 权限,其他人没有任何权限:

     

    % pwd
    /home/xiaq/.ssh
    % chmod 600 id_rsa
    % ls -l id_rsa
    -rw------- 1 xiaq xiaq 1679 Apr  1 20:39 id_rsa

    类似地,确认远程机器上的 ~/.ssh/authorized_keys 只有你有 rw 权限:

     

    % pwd
    /home/xiaq/.ssh
    % chmod 600 authorized_keys 
    % ls -l authorized_keys 
    -rw------- 1 xiaq xiaq 394 2011-04-18 13:40 authorized_keys

     

    4. Over~

    一切顺利的话,你现在就可以不打密码直接 ssh 了。

    不 过,如果你在生成 SSH 密钥对时,为了更安全设置了 passphrase 了的话,ssh 登录时会请你输入 passphrase。为了不用每次都输,可以用 ssh-agent 和 ssh-add,在 X会话或登录session时 ssh-agent 作为 daemon 启动,它存储私钥用于公钥认证,其他程序作为 ssh-agent 的客户就可以在该会话中实现自动认证。Debian, Fedora 上 ssh-agent 已经被自动启动。

    使用 ssh-add 添加私钥:

    ssh-add id_rsa_file

    不带文件参数时,会添加 $HOME/.ssh/id_rsa, $HOME/.ssh/id_dsa 和 $HOME/.ssh/identity。 ssh-add 时需要输入一次 passphrase。之后在同一次会话中的 ssh 远程登录都不再需要输入。

     

    5. 附:公钥加密原理

    公钥加密 (public-key cryptography),或非对称密钥加密 (asymmetric key cryptography) 是一类广泛使用的加密算法。这类算法使用一对密钥即公钥 (public key) 和私钥 (private key)。其中公钥可以随便分发,只用于加密 (encryption),私钥则只由一人持有,只用于解密。任何一个信息用公钥加密之后,用私钥解密即可得到原来的信息,反之则不一定。

    公钥加密的关键点在于,一方面,公钥加密是可逆的,但是不能用公钥推断出私钥。显然数学上,已知一个公钥是能够算出对应私钥的,但是只要设计足够好的加密算法(以及使用足够复杂的密钥对),使得不能在可以接受的时间内破译即可。

    RSA 是一种常见的公钥加密算法。RSA 的工作原理依赖于如下事实:破译 RSA 私钥需要对某些极大的整数进行因数分解,而目前尚未找到快速的对极大整数作因数分解的算法。换言之,如果有人找到了这样的算法,那么全世界的 RSA 加密都会失效。

    RSA是由Ron Rivest, Adi Shamir, Leonard Adleman三人在1978年首次提出的。三人并因此项工作荣获了2002年Turing Award。周时,Rivest还是算法导论的作者之一,书中在31章对RSA系统的原理进行了简要说明,系统实现中利用到了数论中的Euler-Fermat theorem

    COMMENT: 但不管怎么,极大整数的因数分解还是可能的。RSA_Laboratories举办过多次悬赏破译 RSA 的活动,更多信息可以看看 RSA_Secret-Key_Challenge

    尽管随着密码学的发展,RSA 的安全性已经越来越受到威胁,但是未来能诞生可以在多项式时间内破译 RSA 的可能性还是非常小的。也就是说,除了军方、金融等高危目标之外,RSA 还是适用的。

     

    5.1. 进一步阅读

    公钥加密

    Public-key_cryptography

  • 相关阅读:
    MongoDB 基础API使用
    MongoDB -- JAVA基本API操作
    Docker数据管理
    Docker容器的简单使用
    Docker
    Centos 7.3 镜像制作
    Fuel部署OpenStack
    Fuel
    Ceph添加、删除osd及故障硬盘更换
    ceph常用命令
  • 原文地址:https://www.cnblogs.com/qiangxia/p/4211517.html
Copyright © 2011-2022 走看看