使用Terraform 在 Azure AD 进行身份验证的方法如下

首先

各位晚上好,我是小草熊。
HashiCorp公司推出的Terraform非常方便呢。
它是我最喜欢的产品之一。
我想写一些关于不可或缺的Terraform以实现基础设施即代码。

由于在一篇文章中无法完整传达Terraform的所有内容,所以我希望能够逐渐地将它分成几篇文章。

要在 Azure 中使用 Terraform,首先需要进行 Azure AD 认证。
今天,我将写一下关于 Azure AD 认证的方法。

Azure AD 認证方式的方法

在Terraform中,Azure AD认证有以下四种方法:
1. Azure CLI
2. 托管标识
3. 服务主体(客户端证书)
4. 服务主体(密钥)

HashiCorp 的推荐如下:
• 如果希望从 CI 工具等非交互式地调用并使用,可以使用托管 ID 或服务主体。
• 如果希望从本地 PC 调用并使用,请使用 Azure CLI。

Azure CLI 的认证方法需要在本地环境中安装Azure CLI,并且需要进行交互式认证,请注意。
有关最新信息,请参阅以下URL。

这只是一个建议,即使是在本地环境,也不意味着其他身份验证方法无法使用。
与使用对话式身份验证方法相比,使用其他非对话式身份验证方法更加方便。
在选择使用非对话式的托管ID和服务主体进行身份验证时,一个关键问题是从哪里执行Terraform?

两者的特点是,

管理身份

    • Azure AD 認証時にパスワード情報を必要としない (パスワード不要)

 

    Terraform は、Azure 上のリソース (Virtual Machine (以下、VM) など) から実行する必要がある (Azure 外の環境 (オンプレや AWS) からは使えない)

[服务主要人员]

    • Azure AD 認証時にパスワードなどの情報が必要

 

    Terraform は、どこからでも実行可能 (Azure 外の環境 (オンプレや AWS) からでも使える)

如果在Azure中运行的话,我个人推荐使用无需密码信息的2.托管ID。这样可以减少在GitHub上上传包含机密信息的文件的风险。

然而,如果需要从Azure外部环境访问,将只能选择使用服务主体。

请确保在那个时候,严格管理机密信息。

我认为以下 URL 对于 Managed ID 可能会有参考价值。

实施方式

本次我将介绍使用托管身份的实现方法。
简单概括地说,就是像下面这样的感觉。

image.png

我想从启用了托管标识的虚拟机中进行Azure AD身份验证,并在同一租户和订阅内创建资源组。

如果发生流动,将按照以下方式进行。

[前提条件]的前置条件。

    Azure 上に基本的なリソース (Virtual Network (以下、VNET)、VM (CentOS) ) が作成されていること

[ 步驟 ]

    1. 启用VM的管理ID

 

    1. 获取订阅ID和租户ID

 

    1. 安装Terraform

 

    1. 创建模板

 

    执行terraform plan和apply操作

那我们来试试看吧。

激活 VM 管理ID

登入 Azure 门户。
前往 [虚拟机],选择目标虚拟机。
选择 [ID],将状态设置为 [开],选择 [保存]。

image.png

选择 [是]。

image.png

然后授予权限。
转到[订阅],选择目标订阅。

image.png

请按照以下顺序进行选择:[访问控制(IAM)] → [添加角色分配]。

image.png

选择”共同创建者”作为角色,从选择项中选择目标虚拟机。最后选择”保存”。

image.png

2. 获取订阅 ID 和租户 ID

有许多方法可以做到这一点。
例如从Azure门户获取的方法,从Azure CLI获取的方法,从Azure PowerShell获取的方法等等。

我們將介紹使用 Azure CLI 來獲取的方法。
執行 [az login] 命令。
然後會啟動瀏覽器並進行身份驗證。
如果返回以下類似結果,則表示身份驗證成功。

$ az login
Note, we have launched a browser for you to login. For old experience with device code, use "az login --use-device-code"
You have logged in. Now let us find all the subscriptions to which you have access...
[
  {
    "cloudName": "AzureCloud",
    "id": "<サブスクリプション ID>",
    "isDefault": true,
    "name": "従量課金",
    "state": "Enabled",
    "tenantId": "<テナント ID>",
    "user": {
      "name": "hogehoge@example.com",
      "type": "user"
    }
  }
]

由于执行结果中包含订阅 ID 和租户 ID,请将其复制保存。
id 是订阅 ID,
tenantId 是租户 ID。

3. 安装Terraform

Terraform 以二进制方式分发,只需下载并部署即可。
本次使用 CentOS 7.5 作为操作系统。
首先进行下载。

[root@centos75 ~]# curl -OL https://releases.hashicorp.com/terraform/0.11.11/terraform_0.11.11_linux_amd64.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 20.0M  100 20.0M    0     0  32.8M      0 --:--:-- --:--:-- --:--:-- 32.8M

将文件解压到$PATH变量指定的目录。

[root@centos75 ~]# cd /usr/local/bin
[root@centos75 bin]# unzip ~/terraform_0.11.11_linux_amd64.zip
Archive:  /root/terraform_0.11.11_linux_amd64.zip
  inflating: terraform
[root@centos75 bin]# ls -l
total 87388
-rwxrwxr-x. 1 root root 89483552 Dec 14 21:20 terraform

进行安装确认。

[root@centos75 bin]# terraform version
Terraform v0.11.11

4. 创建模板

请预备好 Terraform 的模板。
请从这里进行 git 克隆或复制。

[root@centos75 ~]# git clone https://github.com/c9mau1/terraform-azure-azureadauth.git
Cloning into 'terraform-azure-azureadauth'...
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 10 (delta 0), reused 10 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.

请创建一个 terraform.tfvars 文件,并在其中填写订阅 ID 和租户 ID。

[root@centos75 ~]# cd terraform-azure-azureadauth
[root@centos75 terraform-azure-azureadauth]# vim terraform.tfvars

请将以下内容输入并保存。

subscription_id = "<サブスクリプション ID>"
tenant_id = "<テナント ID>"

准备工作已经完成。

provider.tf文件中包含有关进行Azure AD身份验证的信息。

[2019/01/13 00:03:17 terraform-azure-azureadauth]$ cat provider.tf
variable "subscription_id" {}
variable "tenant_id" {}

provider "azurerm" {
  subscription_id = "${var.subscription_id}"
  tenant_id       = "${var.tenant_id}"
  use_msi     = true
}

在进行Azure AD认证时,请使用”azurerm”。

作为属性,指定subscription_id和tenant_id,并通过use_msi启用托管标识的认证。

在这里,我们将值定义为引用之前创建的 terraform.tfvars 文件作为外部变量。

resource_group.tf 中记录了创建资源组所需的信息。

[2019/01/13 00:06:03 terraform-azure-azureadauth]$ cat resource_group.tf
### Resource Group
resource "azurerm_resource_group" "rg" {
  name     = "${local.res_group}"
  location = "${local.region}"
}

在创建资源组时,使用azurerm_resource_group。

属性是通过指定资源组名称和位置来定义的。

除此之外,还可以指定标签等其他信息。

值被写在 variables.tf 中作为外部变量。

[root@centos75 terraform-azure-azureadauth]# cat variables.tf
locals {
  region            = "japaneast"
  res_group         = "test-rg"
}

5. 运行 terraform

首先,执行init。

[root@centos75 terraform-azure-azureadauth]# terraform init

Initializing provider plugins...
- Checking for available provider plugins on https://releases.hashicorp.com...
- Downloading plugin for provider "azurerm" (1.21.0)...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.azurerm: version = "~> 1.21"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

成功之后,我会制定下一步的计划。

[root@centos75 terraform-azure-azureadauth]# terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + azurerm_resource_group.rg
      id:       <computed>
      location: "japaneast"
      name:     "test-east-rg"
      tags.%:   <computed>


Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

然后进行申请。

请输入一个值,然后输入“是”以继续。

[root@centos75 terraform-azure-azureadauth]# terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + azurerm_resource_group.rg
      id:       <computed>
      location: "japaneast"
      name:     "test-east-rg"
      tags.%:   <computed>


Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

azurerm_resource_group.rg: Creating...
  location: "" => "japaneast"
  name:     "" => "test-east-rg"
  tags.%:   "" => "<computed>"
azurerm_resource_group.rg: Creation complete after 1s (ID: /subscriptions/xxxxx/resourceGroups/test-east-rg)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

这样就完成了!

最后

由于现在可以进行认证,所以我想在今后的次次创建虚拟机和尝试PaaS(如Web应用程序)等方面。

广告
将在 10 秒后关闭
bannerAds