Linux运维的时候,经常需要通过ssh [email protected] 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 [email protected] 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一样,通过秘钥方式实现无密码登录,并且配置更简单方便。
使用时可遵循如下建议便于管理:
- 提前创建秘钥,根据相关命名规则为秘钥命名,避免混淆
- 创建虚机时虽然可以不用指定用户名,但仍建议合理创建用户名并记录,避免需要使用用户名场合时错误
- 使用秘钥登录后,su命令不再需要密码,注意系统安全
- 如果忘记用户名或私钥丢失,可以通过Azure的重置密码功能重置用户名和密码,避免无法登陆虚机: