谈谈Azure Linux的无密码登录

  Linux运维的时候,经常需要通过ssh user@host nme(or IP)的方式登录Linux系统。为了简化操作,很多时候希望能做到无密码登录。所以Linux系统提供了基于秘钥的登录方式。传统的操作方法是用户在本地生成秘钥,将公钥上传到Linux系统并做配置实现此功能;而在Azure上这大大简化了此操作,直接在创建VM就可以配置为通过秘钥登录。
下边就看看如何操作。

生成秘钥

  Azure可以使用预先手工生成的秘钥,也可以在创建VM过程中自动生成秘钥(此方式只适合cli或powershell方式)。
  在Linux或类似系统带有open-ssl软件包,生成秘钥比较方便,一般直接通过ssh-keygen的命令即可生成秘钥:

  可以看到,该命令默认在用户的home路径下创建一个.ssh的隐藏目录,将秘钥文件放入此目录,当然也可以指定目录和文件名,并且可以为秘钥创建密码。
  创建的秘钥文件有两个:后缀pub的公钥文件(azure.pub),以及没有后缀的私钥文件(azure)。
  Windows系统没有原生的秘钥生成工具,有两个解决方案:

  • 使用Linux Subsystem或Cywin等模拟Linux的工具去创建秘钥
  • 安装Git等工具,通过其自带的ssh-keygen工具去创建秘钥

创建无密码登录虚机

Portal

  通过Portal界面创建无密码登录的虚机比较简单,在虚机配置界面中将公钥的内容填入即可(公钥文件用文本编辑器打开复制内容):


  其他步骤照常即可。

CLI

  如前所述,CLI创建无密码登录虚机有两种方式:使用已有秘钥和自动创建秘钥

使用已有秘钥

  通过参数–ssh-key-value azure.pub指定提前生成的秘钥azure.pub(如果不在秘钥所在目录需要指明路径)创建虚机:

自动生成秘钥

  通过参数–generate-ssh-keys可在虚机创建过程中自动生成秘钥:

  可以看到在虚机创建过程中会自动在.ssh目录下生成名为id_rsa的秘钥对。
  做个进阶测试,将自动生成的秘钥对备份,然后再创建一台虚机:

  这次没有创建秘钥的提示,再查看秘钥的生成时间:

  秘钥文件在备份文件之前,说明秘钥文件没变化,对比秘钥文件和备份秘钥文件的内容,也一样:

  由此可见,如果.ssh目录下存在名为id_rsa的秘钥文件对,创建虚机过程中不会再创建秘钥,而是直接使用现有的秘钥。

登录虚机

ssh命令登录

  ssh命令登录很简单,直接ssh user@ip or hostname即可:

  第一次登陆需要确认,然后该主机的指纹被计入.ssh目录下的known_hosts文件,以后就可以无密码自动登录了。

putty工具登录

  使用putty登录,需要导入私钥文件。步骤如下图,从左侧菜单选择SSH展开,点击Auth,再从右侧点击Browse,选择私钥文件(默认putty只显示ppk文件,而创建的私钥无后缀,所以先选择All Files):

  点击Open登录,接受主机,然后输入用户名,却出现错误:

  检查错误原因,是因为putty和生成的私钥不兼容。解决方法是通过工具puttygen来转换秘钥格式,puttygen也可以从putty的官网下载:

  运行该软件,是个综合的秘钥管理工具:

  这里我们做秘钥格式转化,所以选择Load,导入原有私钥:


  点击Save private key保存为putty可识别的私钥(后缀需要手工添加):

  现在putty里导入转化格式后的秘钥:

  顺利登录:

一点点小后续

  用cli创建虚机时,–admin-username这个指定用户名的参数不是必须的,如果不加这个参数会怎样?现在创建一台没有用户名的虚机试试:
  现在登录该虚机:

  可以看到,ssh后不加user可顺利登录。那么,登录的用户到底是谁?从登录提示和who am i命令都可以看出,是执行cli命令创建虚机的客户端的用户名,即在创建虚机过程中,如果不指定虚机的用户名,则默认当前用户名为虚机的用户名。所以异机登录或用putty等工具登录需要用户名时,需要输入创建虚机时的客户端的用户名:

  问题来了,如果在windows下用cli创建虚机,不指定用户名,用什么用户名登录?现在创建一台测试:

  到控制面板检查这台Windows的用户名,由于采用了Live ID的登录方式,所以用户名是邮箱:

  使用putty登录:

  登录失败。
  正确的用户名是什么?注意到用户家目录是c:\user\aubre,有可能是Windows对用户名做了缩写,用缩写后的用户名测试登录:

  成功。
  所以Windows系统如果创建虚机时不加用户名,默认是登录用户名的简写。

总结

  Azure Linux可以如同普通Linux一样,通过秘钥方式实现无密码登录,并且配置更简单方便。
  使用时可遵循如下建议便于管理:

  1. 提前创建秘钥,根据相关命名规则为秘钥命名,避免混淆
  2. 创建虚机时虽然可以不用指定用户名,但仍建议合理创建用户名并记录,避免需要使用用户名场合时错误
  3. 使用秘钥登录后,su命令不再需要密码,注意系统安全
  4. 如果忘记用户名或私钥丢失,可以通过Azure的重置密码功能重置用户名和密码,避免无法登陆虚机: