ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

クラウド環境の標準化をサポートするAWS Cloud Development Kit (AWS CDK)

デジタル庁が推進するガバメントクラウドでも利用されているAWS CDKの利用方法を、AWSが公開しているBaseline Environment on AWS (BLEA)を例にご紹介します。

ライター:奈良 昌紀
通信事業者のデータセンターにおいてネットワーク・サーバー運用を経験した後、ネットワンシステムズに入社。帯域制御やWAN高速化製品担当を経て、2008年から仮想化関連製品を担当。現在は主にクラウド、仮想インフラの管理、自動化、ネットワーク仮想化を担当。

目次

はじめに

デジタル庁が推進するガバメントクラウドの活用が開始されており、弊社でも地方自治体様や自治体向けシステム開発会社様からお問い合わせを頂き、地方自治体様のAWSアカウントの作成や、クラウド接続のお手伝いをさせていただいております。

ガバメントクラウドでは、コスト効率、迅速性、柔軟性、セキュリティを指標とし、この指標を実現するためにInfrastructure as Code (IaC) が採用されています。(参考 : ガバメントクラウドにおけるIaC(Infrastructure as Code)の考え方)デジタル庁が提供するガバメントクラウド環境では以下の2種類のテンプレートが提供されています。

  • 自動適用テンプレート:デジタル庁が払い出す環境に引渡し際に適用されるテンプレート。
  • 必須適用テンプレート:デジタル庁が利用システムへ適用を強制しているテンプレート。利用組織は環境に対して適用する必要がある。

上記2種類のテンプレートと、AWS Organizations のサービスコントロールポリシー (SCP)を利用することで、自治体やシステム開発会社が利用するAWSアカウントにガードレールが実装されます。本ブログでは、アマゾンウェブサービスジャパン合同会社が公開している、Baseline Environment on AWS (BLEA)を例に、AWS Cloud Development Kit (CDK)の利用方法に関してご紹介します。

「ガードレール」とは

セキュリティ上のリスクを予防、検知するための機構。従来はセキュリティを担保するために、ルールを設けてルール違反していないかどうかをチェックしたうえで実装する「ゲート」方式と呼ばれる方式が一般的であったが、スピードや利便性が課題となる。「ガードレール」は設計した運用ポリシーに基づき監視を行い、ポリシーから逸脱した実装を防止、検知することで利用者のスピードと利便性の向上を図る。

Baseline Environment on AWS (BLEA)とは

AWSのセキュリティのベストプラクティスを実装した環境を迅速に実現するためのCDKテンプレートです。 AWS CloudTrail 有効化による API 呼び出しの記録など、AWSアカウントとして基本的に設定すべき内容をベースラインテンプレートとして提供しています。BLEAは単一のアカウントをセットアップするStandalone版と、AWS Control Tower利用環境向けのマルチアカウント版があります。また、 BLEA が提供するのは大きく分けてガバナンスベース (Governance Base)とゲストシステム (Guest System)に分かれます。ガバナンスベースは個別のシステムの実装に依存しない、AWS環境の共通設定であり、CloudTrailやAWS Configのロギング設定やAWS Security Hub、Amazon GuardDutyに対する設定がテンプレートとして実装されています。ゲストシステムはAWSアカウント内で実行されるシステムに対する設定であり、WebアプリケーションとAPIアプリケーション向けのサンプルテンプレートとして実装されています。ガバメントクラウドでは、BLEAにおけるマルチアカウント版のガバナンスベースをベースにした独自テンプレートが提供されます。

AWS CDKとは

AWS CDKは開発者がAWSのインフラストラクチャをコードにより定義することを支援するツールです。TypeScript、JavaScript、Python、Java、C#、Goを利用してインフラストラクチャをコードにより定義することが可能です。例えばAmazon Simple Queue Service (Amazon SQS) キューとAmazon Simple Notification Service (Amazon SNS) トピックを作成する場合、TypeScriptでは以下のようにスタックというデプロイ単位でリソースを記述することができます。TypeScriptのコードはAWS CDKによってAWS CloudFormationテンプレートに変換され、AWS環境の設定や各種リソースの作成を行います。

import { Duration, Stack, StackProps } from 'aws-cdk-lib';
import * as sns from 'aws-cdk-lib/aws-sns';
import * as subs from 'aws-cdk-lib/aws-sns-subscriptions';
import * as sqs from 'aws-cdk-lib/aws-sqs';
import { Construct } from 'constructs';
export class HellocdkStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const queue = new sqs.Queue(this, 'HellocdkQueue', {
      visibilityTimeout: Duration.seconds(300)
    });
    const topic = new sns.Topic(this, 'HellocdkTopic');
    topic.addSubscription(new subs.SqsSubscription(queue));
  }
}

環境準備

まず、githubで公開されているBaseline Environment on AWS(BLEA)リポジトリをクローンします。

$ git clone https://github.com/aws-samples/baseline-environment-on-aws.git
$ cd baseline-environment-on-aws/usecases/blea-gov-base-standalone/

BLEAリポジトリのusecasesディレクトリのスタンドアローン版ガバナンスベース(blea-gov-base-standalone)を既存のAWSアカウントに適用します。

ガバメントクラウドで提供されるテンプレートはTypeScriptによって記述されています。TypeScriptのCDKを利用するには、AWS CLI、Node.jsをインストールし、npmによりaws-cdkをインストールすることで利用可能となります。CDKの初回利用時は、AWS CLIが構成済みの状態でcdk bootstrapコマンドを実行します。BootstrapによりCDKの利用に必要なS3バケットと、IAMロール、IAMポリシー等が追加されます。

$ cdk bootstrap
 ⏳  Bootstrapping environment aws://123456789012/ap-northeast-1...
Trusted accounts for deployment: (none)
Trusted accounts for lookup: (none)
Using default execution policy of 'arn:aws:iam::aws:policy/AdministratorAccess'. Pass '--cloudformation-execution-policies' to customize.
CDKToolkit: creating CloudFormation changeset...
 ✅  Environment aws://123456789012/ap-northeast-1 bootstrapped.

CDKのデプロイ

BLEAでは発見的統制の通知先としてEmailとSlackによる通知を行います。EmailとSlackの通知先はparameter.tsによって定義することができるようになっています。以下のパラメータを任意のものに修正することができます。

  • securityNotifyEmail: セキュリティアラーム送信先メールアドレス
  • securitySlackWorkspaceId: AWS Chatbot Workspace details からコピー - セキュリティアラーム用
  • securitySlackChannelId: Slack App の対象チャネルのリンクから取得 - セキュリティアラーム用
import { Environment } from 'aws-cdk-lib';
export interface AppParameter {
  env?: Environment;
  envName: string;
  securityNotifyEmail: string;
  securitySlackWorkspaceId: string; // required if deploy via CLI
  securitySlackChannelId: string; // required if deploy via CLI
}
// Example
export const devParameter: AppParameter = {
  envName: 'Development',
  securityNotifyEmail: 'notify-security@example.com',
  securitySlackWorkspaceId: 'T8XXXXXXX',
  securitySlackChannelId: 'C00XXXXXXXX',
  // env: { account: '123456789012', region: 'ap-northeast-1' },
};

パラメータを変更したら、cdk synthesizeによりCloudFormationテンプレートが生成(合成=synthesize)され、内容を確認することが可能です。

$ cdk synthesize
Resources:
  IamSysAdminPolicy03754AB3:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      Description: ""
      Path: /
      PolicyDocument:
        Statement:
          - NotAction: iam:*
            Condition:
              Bool:
                aws:MultiFactorAuthPresent: "true"
            Effect: Allow
            Resource: "*"
          - Action: aws-portal:*Billing
            Effect: Deny
            Resource: "*"
...

生成が可能であることを確認したら、CDKスタックのデプロイが可能です。デプロイは`cdk deploy`コマンドを利用します。IAM StatementとIAM Policyに関する変更部分は画面に表示され、変更を反映するかどうか確認され、「y」と回答するとCloudFormationテンプレートが生成され、変更が反映されます。

$ cdk deploy
✨  Synthesis time: 8.26s
This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:
IAM Statement Changes
...(省略)
IAM Policy Changes
...(省略)
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)
Do you wish to deploy these changes (y/n)? y
Dev-BLEAGovBaseStandalone: deploying... [1/1]
Dev-BLEAGovBaseStandalone: creating CloudFormation changeset...
 ✅  Dev-BLEAGovBaseStandalone
✨  Deployment time: 281.45s
Outputs:
Dev-BLEAGovBaseStandalone.ExportsOutputRefDetectionAlarmTopic36C4BB557D18D152 = arn:aws:sns:ap-northeast-1:123456789012:Dev-BLEAGovBaseStandalone-DetectionAlarmTopic36C4BB55-2nSrkow4dAFT
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/Dev-BLEAGovBaseStandalone/8a5d2f50-8681-11ee-86f8-0e5b7c9c700d
✨  Total time: 289.71s

まとめ

弊社ではデジタル庁から提供されるテンプレートが存在しない状態で接続サービスの基本設計を検討する必要があったため、各種サービスで制約が発生することを懸念していましたが、実際にデジタル庁のテンプレートを確認すると、BLEAをベースとしたものであり、他のシステムに影響を与える可能性は低く、アカウント内で自由にAWS 環境を操作できるよう設計されていることが確認できました。

AAWS CDKを利用することで、AWSアカウントに必要な発見的統制に関する設定をIaCとして管理、運用することが可能になります。今回のブログではコマンドラインを利用したCDKの利用方法をご紹介しましたが、ガバメントクラウド環境ではCDKが生成するCloudFormationテンプレートがAWS Service Catalogに「製品」として登録されており、容易に適用することが可能になっています。

ネットワンシステムズでは、地方自治体様や自治体向けシステム開発会社様のAWSアカウントの作成を支援させて頂いております。ガバメントクラウドの利用に関してご不明点があれば是非ご相談ください。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND