通过 R 使用 Linux Azure DSVM 进行 SSH 公钥身份验证

Posted

技术标签:

【中文标题】通过 R 使用 Linux Azure DSVM 进行 SSH 公钥身份验证【英文标题】:SSH public key authentication with Linux Azure DSVM through R 【发布时间】:2019-06-17 04:59:21 【问题描述】:

我正在尝试使用 R AzureDSVM 包通过 R 创建 Linux DSVM。我正在阅读指南 https://raw.githubusercontent.com/Azure/AzureDSVM/master/vignettes/10Deploy.Rmd(Azure DSVM 指南)

首先,该指南要求您创建一个 Azure Active Directory 应用程序,该应用程序将提供“租户 ID”、“客户端 ID”和“用户密钥”,http://htmlpreview.github.io/?https://github.com/Microsoft/AzureSMR/blob/master/inst/doc/Authentication.html(Azure SMR 身份验证指南)中描述的指南

据我了解,这会创建一个在 Azure Active Directory 中注册的应用,为该应用创建一个“身份验证密钥”,即用户密钥,并将该应用与资源组相关联。我已经成功地做到了。

然后,Azure DSVM 指南会以与以下类似的方式创建具有公钥身份验证的 VM:

library(AzureSMR) 
library(AzureDSVM)   

TID <- "123abc"          # Tenant ID
CID <- "456def"          # Client ID
KEY <- "789ghi"          # User key

context <- createAzureContext(tenantID=TID, clientID=CID, authKey=KEY)

resourceGroup<-"myResouceGroup"
location<-"myAzureLocation"
vmUsername<-"myVmUsername"
size<-"Standard_D1_v2"
mrsVmPassword<-"myVmPassword"
hostname<-"myVmHostname"

ldsvm <- deployDSVM(context, 
                    resource.group = resourceGroup,
                    location       = location,
                    hostname       = hostname,
                    username       = vmUsername,
                    size           = size,
                    os = "Ubuntu",
                    pubkey         = PUBKEY)

该指南含糊地描述了从用户私钥创建公钥 (PUBKEY),该公钥被发送到 VM 以允许其提供 SSH 身份验证:

要开始,我们需要加载我们的 Azure 凭据以及 用户的 ssh 公钥。 Linux 上的公钥通常是在 用户的台式机/笔记本电脑,将在 ~/.ssh/id_rsa.pub。创建凭证文件会很方便 包含此信息。凭证文件的内容将 类似于以下内容,我们假设用户创建了这样一个 当前工作目录中的文件,将文件命名为 _credentials.R。 替换为用户的用户名。

TID <- "72f9....db47"          # Tenant ID
CID <- "9c52....074a"          # Client ID
KEY <- "9Efb....4nwV....ASa8=" # User key

PUBKEY   <- readLines("~/.ssh/id_rsa.pub") # For Linux DSVM

我的问题:

此公钥 PUBKEY 是从通过在 Azure SMR 身份验证指南中设置 Azure Active Directory 应用程序(上述脚本中的 KEY 变量)创建的身份验证/用户密钥生成的吗?如果是这样,怎么做?我尝试使用 R 钠库 pubkey(charToRaw(KEY)) 来执行此操作,但我得到“无效的密钥,必须是 32 字节”。

如果 PUBKEY 不是从 KEY 生成的,它是从什么生成的?以及包如何知道如何使用此公钥的私钥进行身份验证?

【问题讨论】:

【参考方案1】:

AAD 密钥用于向 AAD 进行身份验证。公钥/私钥对是独立的,用于对 VM 进行身份验证。如果您没有公钥(在文件 ~/.ssh/id_rsa.pub 中),您可以在 Linux 上使用 ssh-keygen 创建一个。

SSH 连接默认使用私钥(在 ~/.ssh/id_rsa 中)。

【讨论】:

【参考方案2】:

除了 Paul Shealy 的(正确)答案之外,还有几件事:

ssh-keygen 还与 ssh、scp 和 curl 一起安装在最新版本的 Windows 10 Pro 上。否则,您可能安装了 Putty ssh 客户端,在这种情况下,您可以使用 puttygen 保存公钥/私钥对。

AzureDSVM 相当老旧,并且依赖于不再积极维护的 AzureSMR。如果要部署 DSVM,我建议使用 AzureVM 包,它位于 CRAN 和 GitHub。这反过来又建立在AzureRMR 包之上,该包提供了一个用于管理 Azure 资源的通用框架。

library(AzureVM)
az <- AzureRMR::az_rm$new(tenant="youraadtenant", app="yourapp_id", password="password")
sub <- az$get_subscription("subscription_id")
rg <- sub$get_resource_group("rgname")

vm <- rg$create_vm(os="Ubuntu",
    username="yourname",
    passkey=readLines("~/.ssh/id_rsa.pub"),
    userauth_type="key")

查看AzureRMR 和AzureVM 小插图了解更多信息。

免责声明:我是 AzureRMR 和 AzureVM 的作者。

【讨论】:

以上是关于通过 R 使用 Linux Azure DSVM 进行 SSH 公钥身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Azure DSVM/DLVM 上的 nvidia 错误

在 Azure DSVM 上创建和使用自定义 Anaconda 环境

nvidia-smi 命令可以与 nvidia 驱动程序 microsoft azure dsvm 通信

Azure DSVM 上的 Theano

使用 ssh 登录的 azure dsvm 设置的 Jupyterhub 密码

无法在 Azure DSVM 上安装 AzureStor,因为它不会检测到 Rtools