投稿者:林田 誠

こんにちは、今回はAmazon RDS for SQL Serverのデータベース操作ログをIBM Security Guardium(以下、Guardium)を利用して、ログをレポート表示してみたいと思います。
クラウドに移行した場合、データベース監査をどうやって実現するのか悩んでいるかと思います。Guardiumでは、オンプレだけではなくクラウドのDBaaS型のデータベースログをIBM Guardium External S-TAP(以下、External S-TAP)で取得することができます。
どのようにログを取得しているのか仕組みを理解する上でも、実際にAWS上でGuardiumの環境を構築してみました。

前回の記事の続きとなります。
Amazon RDSのSQLログをIBM Security Guardiumで可視化してみた(1)

前回のおさらいです。

構成イメージ

構成イメージは下記となります。
※今回はわかりやすくするためにRDSやGuardium Collectorはシングル構成としています。

secgudestap001.jpg

確認したいこと

・AWS外部のDBユーザー(※自端末)からAmazon RDS for SQL Server(External S-TAP経由)に対して、SQLを実行します。
・AWS外部のDB監査担当(※自端末)からGuardium Collectorに対して、ブラウザでSQL実行ログのレポートを表示します。

構築の流れ

今回は、(2)のExternal S-TAPのデプロイから続きを実施します。

(1)AWSにGuardium Collectorをデプロイ
(2)Amazon EKSクラスターにExternal S-TAPをデプロイ
(3)DBクライアントからSQL実行レポートを表示
  ※AWS関連の詳細については省略しています。

(2)Amazon EKSクラスターにExternal S-TAPをデプロイ

secgudestap016.jpg

(2)- a. Amazon EKSクラスターの作成

External S-TAPが動作するためのAmazon EKSクラスターとワーカーノードを作成します。
EC2上にDockerコンテナを立てて、Dockerコンテナ上でExternal S-TAPを実行することも可能ですが、今回は可用性・耐障害性を考慮してマネージドサービスのAmazon EKSを利用します。

 1 作業端末からコマンドが実行できるように事前にツールを導入しておきます。
   ・AWS Command Line Interface (AWS CLI)
   ・eksctl コマンドラインユーティリティ
   ・kubectl
   ・aws-iam-authenticator

 2 EKSを作成するために、Amazon EKS サービスロール、ワーカーノード用IAMロールへ
   EKS関連のポリシーをアタッチします。
   この後のAWS作業で必要なAWSユーザーを作成して、EKS関連のポリシーをアタッチします。

 3 作業端末のターミナルを開き、以下のコマンドを実行してAWS CLIの接続設定をします。

aws configure

 4 以下のコマンドを実行します。実際にはコマンドは1行となります。
   ※パラメータは各AWS環境に合わせて設定します。

eksctl create cluster
--name visdp1-gdm-eks1・・・クラスター名
--version 1.21
--nodegroup-name guard-workers ・・・ノードグループ名
--region ap-northeast-1 ・・・リージョン
--nodes 2 ・・・ノード数
--nodes-min 1 ・・・最小ノード数
--nodes-max 2 ・・・最大ノード数
--node-type m5d.large ・・・ノードインスタンスタイプ
--vpc-public-subnets subnet-aaaaaaaaaaaaa,subnet-bbbbbbbbbbbbb ・・・パブリックサブネット
--vpc-private-subnets subnet-ccccccccccccc,subnet-ddddddddddddd ・・・プライベートサブネット
--node-private-networking

 5 Amazon EKSのクラスターが作成されていました。
   Amazon EKSのEC2ノードが [Availability Zone 1a] と [Availability Zone 1c] の
   各アベイラビリティゾーンに作成されています。
secgudestap009.jpg

secgudestap010.jpg

 6 Guardium CollectorからEKSクラスターにExternal S-TAPを作成する時に使用するトークンを
   作成します。下記のコマンドで「admin-service-account.yaml」ファイルを実行します。

kubectl apply -f admin-service-account.yaml
admin-service-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: visdp1-gdm-admin・・・任意の名前
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: visdp1-gdm-admin・・・任意の名前
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: visdp1-gdm-admin・・・任意の名前
namespace: kube-system

 下記のコマンドで作成したトークン名を取得します。
 ★トークンは、後でExternal S-TAPをデプロイするときに使用しますのでメモしておきましょう。

kubectl -n kube-system get secret | Select-String visdp1-gdm-admin

Name: visdp1-gdm-admin-token-dm5d6
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: visdp1-gdm-admin
kubernetes.io/service-account.uid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Type: kubernetes.io/service-account-token

Data
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6InFkMEl3SHN5SzZaNmtmUV9BdzZCOWlleWRNdGVxb25pTmxJU2xGQlZN(省略)
ca.crt: 1066 bytes
namespace: 11 bytes

 下記のコマンドでKubernetesクラスターのマスターURLを取得します。
 ★KubernetesクラスターのマスターURLは、後でExternal S-TAPをデプロイするときに使用しますのでメモしておきましょう。

kubectl cluster-info

Kubernetes control plane is running at https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.sk1.ap-northeast-1.eks.amazonaws.com
CoreDNS is running at https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.sk1.ap-northeast-1.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

(2)- b. Dockerレジストリ設定


Dockerレジストリから、External S-TAPのDockerイメージを取得するための設定をします。
Amazon ECSにExternal S-TAPのコンテナイメージを登録してそちらから利用することもできますが、今回はDocker Hubから取得します。

 1 Docker HubのIDがまだ作成していない場合は、新規作成します。
   Dockerのイメージをダウンロード(pull)するには、Docker HubのIDが必要となります。
   https://hub.docker.com/signup
secgudestap017.jpg

 GuardiumのDockerイメージはこちらのようです。
  https://hub.docker.com/r/ibmcom/guardium_external_s-tap

 バージョン毎のタグもあるようです。下記のコマンドでKubernetesクラスターのマスターURLを取得します。
 ★タグとPullコマンドは、後でExternal S-TAPをデプロイするときに使用しますのでメモしておきましょう。
secgudestap018.jpg

docker pull ibmcom/guardium_external_s-tap:v11.3.0.139

 2 Amazon EKSからDocker レジストリに接続するためのシークレットを作成します。
  ★シークレット名は、後でExternal S-TAPをデプロイするときに使用しますのでメモしておきましょう。
  ユーザ名、パスワードは、先ほど作成したDocker HubのID、パスワードを指定します。

kubectl create secret docker-registry regcred・・・シークレット名
--docker-server=https://index.docker.io/v1/・・・DockerレジストリのURL
--docker-username=xxxxxxx・・・ユーザ名
--docker-password=yyyyyyy・・・パスワード

ここまででExternal S-TAPをデプロイする準備が整いました。

(2)- c. External S-TAPのデプロイ

 1 Guardium CollectorのGUI画面にログインします。
   https://(Guardium CollectorのIPアドレス):8443/

ナビゲーションメニューの[管理]-[アクティビティー・モニター]-[外部 S-TAP 制御]を選択します。
secgudestap019.jpg

 2 プラスマークをクリックすると、外部 S-TAP のデプロイの画面が表示されます。
secgudestap020.jpg

 3 Kubernetesタブで、メモしていた値を入力しましょう。
secgudestap021.jpg

 4 Dockerタブも同様に、メモしていた値を入力しましょう。
secgudestap022.jpg

 5 データベースタブも同様に、メモしていた値を入力しましょう。
secgudestap023.jpg

 ※データベース・ホストは、接続するRDSの[エンドポイント]を入力します。
secgudestap024.jpg

 6 Guardiumタブには、Guardium CollectorのIPアドレスを入力します。
secgudestap025.jpg

 7 拡張機能タブは、メンバー数とワーカー・スレッド数を入力します。
   メンバー数:Kubernetesノード上で動作するExternal S-TAPのPOD数となります。
   ワーカー・スレッド数:ノードのvCPU数が上限のため、4 を設定します。
secgudestap026.jpg

 8 外部 S-TAP のデプロイ画面の下部の、[適用]をクリックします。
secgudestap027.jpg

 9 しばらくすると External S-TAPが表示されます。External S-TAPのデプロイができました!!
secgudestap028.jpg
 ※External S-TAP → Guardium Collector の通信 が閉じていると表示されません。
  忘れずにセキュリティグループ、ACLを確認しましょう。
  ・TCP 16016

 10 Kubernetes からも確認してみましょう。
   LoadBalancerが作成されています。1433/TCPポートでリッスンしていますね。

kubectl get svc -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
estap1 LoadBalancer 172.20.254.41 xxxxxxxxxxxxxxxx-yyyyyyyyyyyyyyyy.elb.ap-northeast-1.amazonaws.com 1433:30961/TCP 9s app=estap1
kubernetes ClusterIP 172.20.0.1 <none>

  今度は、PODも確認してみましょう。
  2つのワーカー・ノード上に、2つのPODが作成されているのがわかります。

kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
estap1-65f8fbc5dc-2jhk9 1/1 Running 0 43s 10.221.AA.106 ip-10-221-AA-XX.ap-northeast-1.compute.internal <none> <none>
estap1-65f8fbc5dc-cmdtj 1/1 Running 0 43s 10.221.BB.201 ip-10-221-BB-YY.ap-northeast-1.compute.internal <none> <none>

 External S-TAPのデプロイはここまでです。

(3)DBクライアントからSQL実行レポートを表示

(3)- a. SQL実行

 それでは、DBクライアントからAmazon RDS for SQL Serverにアクセスしてみましょう。
 直接、RDSのエンドポイントに接続するのではなく、AWS ELBにアクセスすると
 EKS上のExternal S-TAPに振り分けされます。
 Extenal S-TAPでは、外部 S-TAP 制御画面のRDSのエンドポイントに対してアクセスします。
secgudestap030.jpg

 1 自端末にインストール済みの Microsoft SQL Server Management Studio を利用します。
secgudestap031.jpg

 サーバー名には、AWS ELBのURLを指定します。

kubectl get svc -owide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
estap1 LoadBalancer 172.20.254.41 xxxxxxxxxxxxxxxx-yyyyyyyyyyyyyyyy.elb.ap-northeast-1.amazonaws.com 1433:30961/TCP 9s app=estap1
kubernetes ClusterIP 172.20.0.1 <none>

 2 データベースに接続できました!!
   一見すると、直接RDSに接続しているように見えますが
   接続先のサーバー名が変わって見えるだけで特に意識なく接続できます。
secgudestap032.jpg

 3 SQLを実行してみます。
   [新しいクエリ]から、SQL Serverのオブジェクト一覧を確認するSELECT文を発行します。
secgudestap033.jpg

 4 SELECT文の結果が表示されました。
   実感はありませんが、External S-TAP経由でSQLが実行されています。
secgudestap034.jpg


(3)- b. レポート確認

 SQLが実行されている裏で、External S-TAPが実行されたSQLのログをGuardium Collectorに送信しています。
 実行されたSQL文をGuardium Collectorで確認してみましょう。
secgudestap035.jpg

 1 Guardium CollectorのGUI画面にログインします。
   https://(Guardium CollectorのIPアドレス):8443/

 2 事前に作成していたレポートを選択します。
   SQL文が実行されたタイムスタンプの降順で、SQL文を表示するシンプルなレポートです。
secgudestap036.jpg

 3 実行したSQL文が表示されているのがわかります。
secgudestap037.jpg


まとめ

いかがでしたでしょうか。External S-TAPを利用することで、クラウドのDBaaS型のデータベースログを確認することができました。クラウド環境の準備は必要ですが、External S-TAPは思ったより簡単にデプロイできるのがわかりました。今回は、Amazon RDS for SQL Server を例にしましたが、OracleやPostgreSQL、MySQLを始めとしたデータベースも同様にログ取得することができます。AWSだけではなく、Google Cloud、Azureのクラウドやオンプレでも同様です。マルチクラウドや複数種類のデータベースの構成でも、統一されたインターフェースでDB監査できるということはDB監査を考える上では大きなメリットですね。
 

弊社の取り扱いセキュリティソリューション

GuardiumによるDB監査によるデータ保護以外にも、ゼロトラスト時代に必要な各種セキュリティソリューションを取り扱っています。
詳しくは、弊社取り扱いのセキュリティソリューションをご参照ください。