見出し画像

AppArmorでコンテナをもっと安全に!その仕組みと使い方

コンテナのセキュリティ、気になりませんか?コンテナ技術は効率的で便利ですが、「セキュリティ対策は十分?」と気になることもありますよね。そんなときに役立つのがAppArmorです。AppArmorはコンテナを安全に保つためのツールで、アプリケーションに細かい制限をかけられる仕組みです。この記事では、AppArmorの仕組みや具体的な使い方、実装の手順、そしてプロファイル適用後にシステムで何が変化するのかもまとめていきます!


目次

  1. AppArmorとは?

  2. AppArmorとコンテナの関係

  3. 実際に使ってみる:AppArmorプロファイルの作成と適用手順

  4. 実用例:NginxでAppArmorを使ったセキュリティ制御

  5. まとめ


1. AppArmorとは?

AppArmorはLinuxカーネルに組み込まれたセキュリティモジュールのひとつです。アプリケーションの「動ける範囲」を指定することで、予期しない動作を防ぎます。イメージとしては、アプリケーションに「専用ルールブック」を持たせるようなものです。

例えば、以下のようなことができます:

  • 許可されたフォルダにだけアクセスできる

  • 指定された操作以外はすべてブロックする

これにより、たとえアプリが脆弱性を突かれても、ダメージを最小限に抑えられます。


2. AppArmorとコンテナの関係

コンテナは「アプリケーションを隔離する箱」ですが、その箱自体が完全なセキュリティを保証するわけではありません。たとえば、コンテナ内部でアプリケーションが暴走した場合、外部の重要なデータにアクセスされるリスクがあります。

そこでAppArmorが役立ちます。
AppArmorは、コンテナに対して「ここまではOKだけど、それ以上はNG」といったルールを設定します。たとえば、以下のようなルールです:

  • コンテナ内の特定フォルダだけ読み取り許可

  • 外部へのネットワーク接続を禁止

これにより、コンテナが安全な「鍵付きの箱」へと進化します。


3. 実際に使ってみる:AppArmorプロファイルの作成と適用手順

ステップ1: AppArmorプロファイルの作成

以下は、書き込み操作を禁止するプロファイルの一例です。

# ファイル名: k8s-apparmor-example-deny-write
profile k8s-apparmor-example-deny-write /usr/sbin/nginx {
    # 書き込み操作を禁止
    deny /** w,
    # 読み取り専用のディレクトリ
    /var/www/** r,
    /etc/nginx/** r,
    # 必要なネットワーク許可
    capability net_bind_service,
}

このプロファイルでは以下を設定しています:

  • すべての書き込み操作を禁止

  • Nginx設定ディレクトリやWebコンテンツを読み取り専用に設定

  • ネットワークサービス(ポートのバインド)を許可

ステップ2: AppArmorプロファイルをロード

作成したプロファイルをLinuxシステムにロードします。以下のコマンドを実行してください:

sudo apparmor_parser -q ./k8s-apparmor-example-deny-write


コマンド実行後に変化する内容

プロファイルがカーネルにロードされる
このコマンドを実行すると、プロファイルがAppArmorの管理下に入り、すぐに有効になります。

プロファイルの適用状況を確認する
以下のコマンドで、ロードされたプロファイルを確認できます:

sudo apparmor_status

結果例:

apparmor module is loaded.
profiles are loaded.
profiles are in enforce mode.
profiles are in complain mode.
k8s-apparmor-example-deny-write

k8s-apparmor-example-deny-writeがリストに表示されていればロード成功です。

関連ファイルの変化
プロファイルの内容が/etc/apparmor.d/k8s-apparmor-example-deny-writeに保存されます。このファイルが有効な設定として参照されます。


ステップ3: KubernetesでAppArmorを適用

作成したプロファイルをKubernetesのDeployment設定に追加します。

Deployment設定

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-secure
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      securityContext:
        appArmorProfile:
          type: Localhost
          localhostProfile: k8s-apparmor-example-deny-write
      containers:
      - name: nginx-container
        image: nginx:latest
        ports:
        - containerPort: 80
        securityContext:
          readOnlyRootFilesystem: true
          allowPrivilegeEscalation: false

デプロイして確認

Deploymentを作成し、Kubernetesに適用します:

kubectl apply -f nginx-apparmor-deployment.yaml

Nginxコンテナが正しく動作しているか確認します:

kubectl get pods

AppArmorが適用されていることを確認するため、以下の手順で書き込み操作を試します。

コンテナ内に入ります:

kubectl exec -it <pod-name> -- /bin/bash

コンテナ内で書き込み操作を実行してみます:

echo "test" > /etc/testfile

結果

書き込み操作がブロックされ、次のようなエラーが表示されます:

bash: /etc/testfile: Permission denied

4. 実用例:NginxでAppArmorを使ったセキュリティ制御

NginxをAppArmorで保護することで、以下のようなシナリオに対応できま
す:

  • Webコンテンツを読み取り専用にする

  • 設定ファイルの改ざんを防ぐ

  • 不正な書き込み操作をブロック

NginxにAppArmorプロファイルを適用することで、予期せぬ操作をブロックし、セキュリティを強化できます。


5. まとめ

AppArmorを活用すれば、Kubernetes上のコンテナに対して強力なセキュリティを簡単に追加できます。プロファイルを作成し、apparmor_parserでロードしてからKubernetesの設定に組み込むだけです。

特にNginxのようなよく使われるアプリケーションに適用すれば、設定ファイルの改ざんや不正な操作を防げるので安心です。手順もシンプルなので、ぜひ試してみてください!

いいなと思ったら応援しよう!