AKSクラスタをOrca Securityでスキャンしてみた

TerraformでAzure Kubernetes Serviceを作成してOrca Securityでスキャンしてセキュリティリスクがどの程度あるか診断してみました。この記事は手順の備忘録です。

# 前提条件
前提条件です。Orca Securityのテナント払い出しは営業担当者経由で実施します。[こちら](https://orca.security/demo/)からコンタクトお願いします。
- Azureのアカウントが払い出されていて有効化されたSubscriptionが1つ以上ある
- Orca Securityのテナントが払い出されている
- MacBookにAzure CLI, Git, Terraformがインストール済


# 作業ログ
## Azure Kubernetes Serviceクラスタの作成
Azure CLIで該当のAzureテナントにLoginします。Chomeが起動してLogin認証を求められます。ご自身のアカウントでLoginお願いします。

```console
$ az login
```

TerraformのAzureサンプルをGit RepoからCloneします。

```console
$ git clone git@github.com:hashicorp/terraform-provider-azurerm.git
```

terraform-provider-azurerm/examples/kubernetes/basic-cluster/outputs.tfを編集して各々のブロックに"sensitvie = true"を追加します。以下編集後の状態です。

```terraform
output "id" {
  value = azurerm_kubernetes_cluster.example.id
  sensitive = true
}

output "kube_config" {
  value = azurerm_kubernetes_cluster.example.kube_config_raw
  sensitive = true
}

output "client_key" {
  value = azurerm_kubernetes_cluster.example.kube_config.0.client_key
   sensitive = true 
}

output "client_certificate" {
  value = azurerm_kubernetes_cluster.example.kube_config.0.client_certificate
   sensitive = true
}

output "cluster_ca_certificate" {
  value = azurerm_kubernetes_cluster.example.kube_config.0.cluster_ca_certificate
  sensitive = true 
}

output "host" {
  value = azurerm_kubernetes_cluster.example.kube_config.0.host
  sensitive = true
}

```

Terraformを初期化します。

```console
$ terraform init
Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/azurerm from the dependency lock file
- Using previously-installed hashicorp/azurerm v3.12.0

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.
```

applyしてAzure Kubernetes Serviceクラスタを作成します。var.localtionには任意のAzure Regionを、var.prefixには任意の文字列を指定します。


```console
$ terraform apply
var.location
  The Azure Region in which all resources in this example should be provisioned

  Enter a value: East US

var.prefix
  A prefix used for all resources in this example

  Enter a value: cookiewanwan


Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:
--omit--
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Outputs:
--omit--
```

Resourceが作成できているか確認します。

```console
$ az resource list
[
  {
    "changedTime": "2022-07-04T02:39:03.390194+00:00",
    "createdTime": "2022-07-04T02:35:10.654842+00:00",
    "extendedLocation": null,
    "id": "/subscriptions/adbf3b45-677e-427b-af99-4bfa3c1f27a4/resourceGroups/cookiewanwan-k8s-resources/providers/Microsoft.ContainerService/managedClusters/cookiewanwan-k8s",
    "identity": {
      "principalId": "27f52891-62ab-42eb-9db1-fed3d388b4c8",
      "tenantId": "6a5f91fe-6a84-4d5b-a7f1-dbab8a01b1e4",
      "type": "SystemAssigned",
      "userAssignedIdentities": null
    },
    "kind": null,
    "location": "eastus",
    "managedBy": null,
    "name": "cookiewanwan-k8s",
    "plan": null,
    "properties": null,
    "provisioningState": "Succeeded",
    "resourceGroup": "cookiewanwan-k8s-resources",
    "sku": null,
    "tags": null,
    "type": "Microsoft.ContainerService/managedClusters"
  },
  {
    "changedTime": "2022-07-03T23:49:38.179685+00:00",
    "createdTime": "2022-07-03T23:39:37.783959+00:00",
    "extendedLocation": null,
    "id": "/subscriptions/adbf3b45-677e-427b-af99-4bfa3c1f27a4/resourceGroups/NetworkWatcherRG/providers/Microsoft.Network/networkWatchers/NetworkWatcher_eastus",
    "identity": null,
    "kind": null,
    "location": "eastus",
    "managedBy": null,
    "name": "NetworkWatcher_eastus",
    "plan": null,
    "properties": null,
    "provisioningState": "Succeeded",
    "resourceGroup": "NetworkWatcherRG",
    "sku": null,
    "tags": null,
    "type": "Microsoft.Network/networkWatchers"
  }
]
```

## Orca Securityでスキャン
ChromeでOrca SecurityのコンソールにLogin、右下の"Settings"-->"Connect Account"をクリック、"Microsoft Azure"を選択します。
<img src="https://i.imgur.com/sLJDyhj.png" widthd="70%">

該当のテナントIDを取得します。

```console
$ az account show | jq .tenantId
"6a5f91fe-6a84-4d5b-a7f1-dbab8a01b1e4"
```

該当のSubscriptionIDを取得します。

```console
$ az account list --query "[?state == 'Enabled'].id" -o tsv --all
adbf3b45-677e-427b-af99-4bfa3c1f27a4
```

コンソールに戻って取得した値をペーストします。"APPROVE THE APP"をクリックしてAzure AD Enterprise Applicationを作成することを承認します。"Run the onboarding template by clicking here HERE"をクリックして、Orca Securityがスキャンするために必要なAzureリソースを作成します。
<img src="https://i.imgur.com/bhMdcL6.png" widthd="70%">

右下の"Connect Account"をクリックするとスキャンが開始します。
<img src="https://i.imgur.com/X9bmTgv.png" width="70%">

数十分後にスキャンが完了します。Alertのサンプルを掘り下げて見てみます。Terraformで作成したデフォルトのRoleが持つ権限が広範囲なPermissionを持ちすぎているので注意と怒られます。細かいですね。
<img src="https://i.imgur.com/R7aXCwt.png" width="70%">

 
# おわりに
最後までお付き合い頂きありがとうございます。この記事では作成したk8sクラスタは空のためPII等気密性の高い情報は含まれていませんが、実運用では住所やマイナンバー等、PIIに該当する情報がPublicなS3バケットに暗号化されていない状態で置かれていて簡単に漏洩してしまうケースもあるかと思います。Orca Securityはそのような状態を緊急Alertとして上げてSecurityチームに直ちに対処するように促します。