今日を知り、明日を変えるシステム運用メディア

BicepでAzureリソースのコード作成、Checkovでセキュリティチェックを行う方法

BicepでAzureリソースのコード作成、Checkovでセキュリティチェックを行う方法

Azure環境でリソースを効率的に構築し、そのセキュリティを担保するためには、IaCツールのBicepとセキュリティチェックツールのCheckovを活用するのが効果的です。

本記事では、AzureリソースをBicepで作成し、Checkovでセキュリティチェックを行う手順を解説します。

IaCツール「Bicep」とは

Bicepとは、Azureリソースを効率的に構築・管理するためのインフラストラクチャコード(IaC)ツールです。従来のARMテンプレートに比べ、簡潔で読みやすい構文を持ち、複雑なAzureリソースの作成や管理を大幅に簡略化できます。

Bicepの最大の特徴は、コードの簡潔さと再利用性の高さです。複雑なAzureリソースの構成を簡単に記述できるだけでなく、モジュール化することで、チームでの開発効率を向上させることができます。また、Bicep CLIを使用することで、構文チェックやデプロイが容易に行え、Azure環境の自動化に最適なツールと言えるでしょう。

さらに詳しい解説は、 こちらの記事(Azureのリソース作成が可能なBicepとは?ARM テンプレートとの違いを比較!の記事を挿入)をご覧ください。

Checkovとは

Checkov

Checkovは、IaC(Infrastructure as Code)ツールで記述されたコードのセキュリティチェックを行うためのオープンソースツールです。

Terraform、CloudFormation、Kubernetesマニフェスト、Bicepなど、さまざまなIaCツールに対応しており、セキュリティポリシーに基づいてコードを検証します。これにより、リソースのデプロイ前に潜在的なセキュリティリスクを検出でき、クラウド環境のセキュリティを向上させることが可能です。

Checkovの特徴は、組み込みのセキュリティポリシーが豊富に用意されている点です。たとえば、ネットワークの設定ミスや暗号化の欠如といった問題を検出し、詳細な修正ガイドを提供します。

さらに詳しく知りたい方はこちらの記事「TerraformコードのセキュリティチェックができるCheckovとは」をご覧ください。

事前準備、作成の流れ

事前準備

本手順では、以下のツールを利用します。本手順に着手する前に、これらがインストール済みであり、Azure CLIにログイン済みであることを確認してください。

  • Azure CLI(Azureリソース管理用ツール)
  • Visual Studio Code(Bicepファイルの編集用)
  • Bicep CLI(AzureリソースのIaC管理ツール)
  • Checkov(セキュリティチェックツール)
  • Azureアカウント(必要な権限を持つアカウント)

今回構築するもの

本記事では、以下のリソースをBicepコードで作成、実際にAzure環境にデプロイする方法を解説します。

  1. リソースグループ(RG): Azureリソースを管理する単位。
  2. 仮想ネットワーク(VNet): リソース間の通信を構築するネットワーク基盤。
  3. 仮想マシン(VM): アプリケーションやサービスの基盤となる仮想サーバ。
  4. SQLデータベース: データ管理を担う高機能なサービス。

Azureリソース作成の流れ

今回は以下の流れでAzureリソースを構築します。

  1. Bicepでコードを書く
    必要なAzureリソースをBicepファイルで記述します。
  2. リソースグループを作成する
    最初にAzureリソースを配置するためのリソースグループを作成します。
  3. コードをテストして確認する
    書いたコードに問題がないか検証します。
  4. Azure環境にデプロイ
    実際にAzureリソースをデプロイします。
  5. Azureポータルで確認
    作成されたリソースが正しく反映されているか確認します。

Bicepコードを記述した、Azureリソースの作成方法

Bicepでコードを書く

Bicepを使用してAzureリソースをコードで作成するため、テスト用のフォルダとファイルを作成し、コードを記述します。

テスト用フォルダとファイルの作成

最初にターミナルで以下のコマンドを実行し、新しいフォルダとファイルを作成します。

mkdir Bicep-Test
cd Bicep-Test
touch main.bicep

作成されたフォルダ内に、Azureリソースを定義するためのコードを記述する main.bicep ファイルが生成されます。

Bicepコードを記述

main.bicep の内容 以下のコードを main.bicep ファイルにコピーします。

<main.bicep>

targetScope = ‘resourceGroup’

param location string = ‘japaneast’
param vnetName string = ‘OpsToday-VNet’
param addressSpace string = ‘10.0.0.0/16’
param subnet1Name string = ‘OpsToday-vmSubnet’
param subnet1Prefix string = ‘10.0.1.0/24’
param subnet2Name string = ‘OpsToday-sqlSubnet’
param subnet2Prefix string = ‘10.0.2.0/24’
param nsg1Name string = ‘OpsToday-vmNsg’
param nsg2Name string = ‘OpsToday-sqlNsg’
param vmName string = ‘OpsToday-VM’
param adminUsername string = ‘azureuser’
@secure()
param adminPassword string = ‘Admin1234#’
param sqlServerName string = ‘Opstoday-SqlServer’
param sqlAdminUsername string = ‘sqladmin’
@secure()
param sqlAdminPassword string = ‘Admin1234#’

// Virtual Network 作成
resource vnet ‘Microsoft.Network/virtualNetworks@2023-04-01’ = {
name: vnetName
location: location
properties: {
  addressSpace: {
    addressPrefixes: [addressSpace]
  }
  subnets: [
    {
      name: subnet1Name
      properties: {
        addressPrefix: subnet1Prefix
        networkSecurityGroup: {
          id: nsg1.id
        }
      }
    }
    {
      name: subnet2Name
      properties: {
        addressPrefix: subnet2Prefix
        networkSecurityGroup: {
          id: nsg2.id
        }
      }
    }
  ]
}
}

// NSG作成
resource nsg1 ‘Microsoft.Network/networkSecurityGroups@2023-04-01’ = {
name: nsg1Name
location: location
}

resource nsg2 ‘Microsoft.Network/networkSecurityGroups@2023-04-01’ = {
name: nsg2Name
location: location
}

// Virtual Machine
resource nic ‘Microsoft.Network/networkInterfaces@2023-04-01’ = {
name: ‘${vmName}-nic’
location: location
properties: {
  ipConfigurations: [
    {
      name: ‘ipconfig1’
      properties: {
        subnet: {
          id: vnet.properties.subnets[0].id
        }
        privateIPAllocationMethod: ‘Dynamic’
      }
    }
  ]
}
}

// VM作成
resource vm ‘Microsoft.Compute/virtualMachines@2024-07-01’ = {
name: vmName
location: location
properties: {
  hardwareProfile: {
    vmSize: ‘Standard_B2s’
  }
  osProfile: {
    computerName: vmName
    adminUsername: adminUsername
    adminPassword: adminPassword
  }
  storageProfile: {
    imageReference: {
      publisher: ‘MicrosoftWindowsServer’
      offer: ‘WindowsServer’
      sku: ‘2019-Datacenter-smalldisk’
      version: ‘latest’
    }
    osDisk: {
      createOption: ‘FromImage’
    }
  }
  networkProfile: {
    networkInterfaces: [
      {
        id: nic.id
      }
    ]
  }
}
}

// SQL Server作成
resource sqlServer ‘Microsoft.Sql/servers@2023-02-01-preview’ = {
name: sqlServerName
location: location
properties: {
  administratorLogin: sqlAdminUsername
  administratorLoginPassword: sqlAdminPassword
  version: ‘12.0’
}
}

リソースグループを作成する。

ターミナルで以下のコマンドを実行し、テスト用フォルダにリソースグループ用のファイルを作成します。

touch resourceGroups.bicep

Bicepコードを記述

resourceGroups.bicep に以下のコードをコピーします。

<resourceGroups.bicep>

targetScope = ‘subscription’

param rgName string = ‘OpsToday-bicep-test’
param location string = ‘japaneast’

var tags = {
  Usage: ‘OpsToday’
}

resource RG ‘Microsoft.Resources/resourceGroups@2022-09-01’ = {
  name: rgName
  location: location
  tags: tags
}

リソースグループの作成

Azure CLIにて以下のコマンドを実行して、リソースグループを作成します。

az deployment sub create –name bicep-test –location japaneast –template-file ./resourceGroups.bicep

リソースグループが作成されます。

書いたコードをテストして確認する

コードをテストして構文に問題がないことを確認します。

テストの実行

以下のコマンドをターミナルで実行し、main.bicep の構文を検証します。

az deployment group what-if \  -g OpsToday-bicep-test \  –template-file main.bicep

出力される内容を確認し、作成されるリソースが期待通りであるかを確認します。


※@secure() パラメータにハードコードされたデフォルト値を設定しているため警告がでますが、今回の検証では無視していただいて問題ありません。

実際にAzure環境にデプロイ

次に、Azure環境にリソースをデプロイします。

main.bicep を使用してリソースをデプロイ

テスト内容に問題がなければ以下のコマンドを実行して、リソースをデプロイします。

az deployment group create \
  –resource-group OpsToday-bicep-test \
  –template-file main.bicep

実行が完了すると、Azureポータルに指定したリソース(仮想ネットワーク、VM、SQLサーバーなど)が作成されます。

Azureポータル上でリソースを確認

Azureポータルにログインし、作成したリソースが正しくデプロイされていることを確認します。

Checkovで、Azureリソースをセキュリティチェック

AzureリソースをBicepコードで作成した後は、Checkovを使ってセキュリティチェックを行い、構成がセキュリティ基準を満たしているかを確認します。

checkov -d .

このコマンドは、現在のディレクトリ(-d .)にあるファイルやフォルダをスキャンし、セキュリティポリシーに基づいて検証します。

下記の画像のような出力がされていればチェック成功です。

Checkovの出力結果

コマンドを実行すると、以下のような結果がターミナルに表示されます。

  • Passed checks: セキュリティポリシーに準拠しているリソース。
  • Failed checks: セキュリティポリシーに違反しているリソース。
  • Skipped checks: スキップされたチェック項目(今回は通常0件)

エラーの詳細確認

Checkovの出力には、具体的なエラー項目が表示されます。

今回出力された以下の内容に着目してみましょう。

こちらのエラーは、仮想マシンのディスク暗号化が有効になっていないためFAILEDとなっています。
Guideに表示されているURLを開きエラーの詳細を確認してみましょう。

URLを開くと「Azure Windows VM では暗号化が有効になりません」とエラーが表示されました。ここで重要度やサブタイプ等も確認できます。

下にスクロールすると、エラーの説明や修正方法についても確認できます。

掲載情報を参考にコードを修正してみましょう。修正後は、コードを再度セキュリティチェックし、「CKV_AZURE_151」がPassedになるか確認してください。

修正後のコード例

以下のプロパティを vm リソースに追加します。

resource vm ‘Microsoft.Compute/virtualMachines@2024-07-01’ = {
  name: vmName
  location: location
  properties: {
    hardwareProfile: {
      vmSize: ‘Standard_B2s’
    }
    osProfile: {
      computerName: vmName
      adminUsername: adminUsername
      adminPassword: adminPassword
    }
    storageProfile: {
      imageReference: {
        publisher: ‘MicrosoftWindowsServer’
        offer: ‘WindowsServer’
        sku: ‘2019-Datacenter-smalldisk’
        version: ‘latest’
      }
      osDisk: {
        createOption: ‘FromImage’
        encryptionSettings: {
          enabled: true
        }
      }
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: nic.id
        }
      ]
    }
  }
}

作成したリソースを削除する

Azure環境に作成したリソースは不要になった場合、リソースグループごと削除することで効率的に管理できます。リソースグループを削除すると、その中に含まれるすべてのリソース(仮想ネットワーク、仮想マシン、SQLサーバーなど)が一括で削除されます。

削除コマンド

以下のコマンドを使用してリソースグループを削除します。

az group delete –name <リソースグループ名>

今回の場合

​​今回作成したリソースグループの名前は OpsToday-bicep-test です。削除するには次のコマンドを実行します。

az group delete –name OpsToday-bicep-test

このコマンドを実行すると、リソースグループとその中のすべてのリソースが削除されます。削除処理には時間がかかる場合があります。

まとめ

本記事では、Bicepを使用したAzureリソースの作成から、Checkovによるセキュリティチェック、不要になったリソースの削除までの手順を解説しました。Bicepを活用することで、Azureリソースを簡潔かつ効率的に管理でき、Checkovによるセキュリティ検証で安全性を確保できます。

また、リソース削除を適切に行うことで、コストやリソースの無駄を削減できます。これらの手順を取り入れ、Azure環境を効率的かつ安全に運用してください。

現在クラウドエンジニアとして勤務。AWS(SAP、DOP)とAzure(AZ-305)の資格を保有しており、ネットワークやセキュリティに関する業務を主に行っています。

人気の記事

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録