
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は、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環境にデプロイする方法を解説します。
- リソースグループ(RG): Azureリソースを管理する単位。
- 仮想ネットワーク(VNet): リソース間の通信を構築するネットワーク基盤。
- 仮想マシン(VM): アプリケーションやサービスの基盤となる仮想サーバ。
- SQLデータベース: データ管理を担う高機能なサービス。
Azureリソース作成の流れ
今回は以下の流れでAzureリソースを構築します。
- Bicepでコードを書く
必要なAzureリソースをBicepファイルで記述します。 - リソースグループを作成する
最初にAzureリソースを配置するためのリソースグループを作成します。 - コードをテストして確認する
書いたコードに問題がないか検証します。 - Azure環境にデプロイ
実際にAzureリソースをデプロイします。 - 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環境を効率的かつ安全に運用してください。