😸

SlackからIAMグループの移動を実現する方法

に公開

こんにちは、こよいです。

みなさんAWS権限管理はどのようにしてるでしょうか?

権限管理を行わないと、商用環境のリソースを誰でも触れるようになってしまい、思わぬトラブルにつながってしまいます。

そこで、私の所属しているプロジェクトでは、AWSの権限管理は以下のように行なっています。

このような管理方法だと、IAMGroupに所属させるだけのために、AWSへログインする必要があります。

お忙しい管理者にとってめんどくさいですね。管理者はそもそもあまりAWSとかにログインしていないと思います。笑

このような状態を解決すべく、管理者から「もっと簡単に権限管理する方法ない?」と要望を受けました。

そこで、SlackからIAMグループの移動を実現しましたので、ご紹介いたします。

この方法を取り入れることで、SlackにてAWSコマンドを打つことが可能になり、簡単にIAMグループの移動をすることができるようになりました。

イメージ図

AWS Chatbotとは?

AWS Chatbotは、AWSの各種サービスとSlackやMicrosoft Teamsを連携し、操作やモニタリングを簡単にしてくれるサービスです。

これを使うと、SlackからLambdaを操作できるので、AWS内サービスのほとんどを操作できることになります。

AWS Chatbot | AWS

AWS Lambdaとは?

AWS LambdaはAWSが提供するサーバレスサービスで、サーバを管理することなく、コードを実行できるサービスです。

実行したい処理が書かれたコードをLambda上にアップロードし、そのLambdaを起動することで、処理を実行できます。

AWS Lambda とは - AWS Lambda

前提

早速ですが、作っていきますが以下の準備ができていることを前提とします。

  • Slackアカウントあり(無料アカウントでオーケー)
  • Python3.12
  • AWSの基本的な知識があること

テスト用のIAMグループを作ってユーザがそのグループに所属させる/外すができたら成功です。

検証用IAMグループの作成

検証用にIAMグループを作ります。

特にこのグループでの操作はないので、ポリシーの付与は不要です。

名前はiam-group-outhとしておきましょう。

Untitled

Lambda実行ロールの作成

LambdaはIAMグループにユーザを移動する操作を行います。この操作をできるように、まずLambda実行ロールには、作ったiam-group-outhにユーザを追加削除できる権限を追加します。

ロール名

iam-role-lambda-chatops-outh

信頼関係

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

インラインポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:AddUserToGroup",
                "iam:RemoveUserFromGroup"
            ],
            "Resource": "arn:aws:iam::111111111111:group/iam-group-outh"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}

Lambdaの作成

Lambdaで使うロールができたので、Lambdaを作っていきます。

IAMグループにユーザを加える、外す処理を書いていきます。

関数名

lambda-chatops-auth

コード

UserNameは移動させたいユーザ名を適宜置き換えてください。

import boto3

def lambda_handler(event, context):
    iam = boto3.client('iam')
    
    is_grant = event['is_grant']
    
    if is_grant == True:  # Use Python's True instead of true
        response = iam.add_user_to_group(
            GroupName='iam-group-outh',
            UserName='<任意ユーザ>',
        )
        message = "ユーザがグループに追加されました。"
    else:
        response = iam.remove_user_from_group(
            GroupName='iam-group-outh',
            UserName='<任意ユーザ>',
        )
        message = "ユーザがグループから外されました。"
    
    # CloudWatchLogsに出力する
    print(message)
    
    # Slackに出力する
    return message

Slackチャンネルの作成

Slackの画面に移動し、「チャンネル」→「作成」→「チャンネルを作成する」の順にクリック。

CleanShot 2024-08-15 at 22.55.36.png

以下のような画面が出現するので、任意のチャンネル名を記載し、次へをクリック。

今回はchatbot-testとします。

CleanShot 2024-08-15 at 22.59.08.png

可視性は今回はパブリックとし、作成をクリック。

権限管理の観点からプライベートを選んだ方が良い場合もあります。

CleanShot 2024-08-15 at 23.02.08.png

メンバーすべてを追加するにチェックを入れた状態で、終了をクリック

CleanShot 2024-08-15 at 23.04.00.png

こんな感じにチャンネルが作成されました!

CleanShot 2024-08-15 at 23.06.42.png

AWS ChatBotの作成

AWS Chatbot がコマンドを実行できるようにするために、Slack で AWS Chatbot を設定していきます。設定するためには、次のような手順を行います。

ステップ1:Slackクライアントを設定する

ステップ2:Slackチャンネルを設定する

ステップ1:Slackクライアントを設定する

AWS Chatbot がコマンドを実行できるようにするために、Slack で AWS Chatbot を設定していきます。

ワークスペースとAWS ChatBotを接続します。

ChatBot画面に行き、チャットクライアントを設定にてチャットクラントにて「Slack」を選び、「クライアントを設定」をクリックします。

CleanShot 2024-08-25 at 09.27.34@2x.png

Slackの認証画面にて「許可する」をクリック。

CleanShot 2024-08-25 at 09.29.19@2x.png

Tutorial: Get started with Slack - AWS Chatbot

この時点で、SlackにAWSChatBotアプリが登録されましたので、確認しておきます。

Slackにいき、「アプリを追加する」をクリック。

CleanShot 2024-08-29 at 09.07.10@2x.png

登録されていれば「AWS Chatbot」が登録されていることがわかります。

CleanShot 2024-08-29 at 09.07.23@2x.png

ステップ2:Slackチャンネルを設定する

AWS Chatbot が Slack チャンネルでコマンドを実行できるようにするには、Slack チャンネルで AWS Chatbot を設定する必要もあります。チャンネルの設定は、次のとおりです。

  • Slack チャンネルに AWS Chatbot を追加する
  • チャンネルで利用する、ガードレールポリシーの作成
  • 構成にチャネルを関連付けとユーザー権限を定義
  1. Slack チャンネルに AWS Chatbot を追加する。

    1. Slackチャンネルの作成 手順で作成したSlack チャンネルで、invite @aws と入力します。
    2. 「招待」を選択します。

    CleanShot 2024-08-25 at 10.04.29@2x.png

  2. チャンネルで利用する、ガードレールポリシーを作ります。

    チャンネルを作る前にガードレールポリシーを作ります。

    ChatBotにはLambdaを操作する権限のみをつけます。

    ガードレールポリシー

    ポリシー名

    iam-policy-chatbot-guardrail-chatops-outh

    ポリシー

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "lambda:InvokeFunction",
                "Resource": "arn:aws:lambda:ap-northeast-1:111111111111:function:lambda-chatops-auth"
            }
        ]
    }
    
  3. 構成にチャネルを関連付けとユーザー権限を定義

    AWS Chatbot コンソールのワークスペースの詳細ページで、 「**新しいチャネルの設定」**をクリックします。

    CleanShot 2024-08-27 at 08.20.46@2x.png

    設定の詳細で、設定名を入れます。

    今回は、chatbot-channel-chatops-outhとします。

    ログ記録は、チェックを外します。

    ログは、Cloud Wtach Logsへ記録されます。ログにはchatbotを利用した、ワークスペースや、チャンネル、ユーザ情報、実施したコマンド情報などが取れますが、今回は料金がかかってしまうので、利用しません。

    Slack チャネルでは、手順 1 で使用したチャネルを選択します。

    AWS Chatbot はパブリックチャネルとプライベートチャネルの両方をサポートしていますが、今回は、パブリックチャネルを利用します。

    パブリックを選択し、パブリックチャネル名にて手順 1 で使用したチャネルを選択します。

    CleanShot 2024-08-27 at 08.27.01@2x.png

    アクセス許可のセクションでは、チャンネルユーザのロール、チャンネルガードレールポリシーを設定します。それぞれの用語の定義は以下の通りです。ロールの設定によってチャンネルメンバーに与えられる権限が決まります。用途に応じて、指定してください。

    • チャンネルロールは、Slack上のチャンネルに存在するユーザ全員の権限を管理します。
    • ユーザロールは、特定のユーザのみの権限を管理します。
    • チャンネルガードレールは、チャンネルメンバーが利用できるアクションを制御します。チャンネルガードレールポリシーは、チャンネル上最も優先されるポリシーで、ここで許可されていない操作は、チャンネルロールや、ユーザロールに存在しようと、操作できません。

    Understanding AWS Chatbot permissions - AWS Chatbot

    今回は、まず実施してみることを目的とするので、チャンネルロールを使いたいと思います。

    ロール設定では、「チャネルロール」を選択します。

    チャネルロールで、「テンプレートを使用してIAMロールを作成する」を選択します。

    ロール名は、iam-role-chatbot-channel-chatops-outhとします。

    ポリシーテンプレートは、「Lambda呼び出しコマンドのアクセス許可」を選択します。

    このロールは、すべてのLambdaを実行することができる権限になっています。

    チャンネルガードレールポリシーは、手順2で作成した「iam-policy-chatbot-guardrail」を選択します。

    チャンネルロールでは、すべてのLambdaの実行が可能な状態となっていますが、ガードレールポリシーで権限を絞ることができます。先に設定した通り、ガードレールポリシー「iam-policy-chatbot-guardrail」は、Lambda「lambda-chatops-auth」の実行権限のみ付与されているので、このチャンネルメンバーは、他のLambdaの実行はできないようになっています。

    CleanShot 2024-08-27 at 08.56.28@2x.png

    通知のセクションは設定しません。AWS側からSlackに通知するような仕組みを実装する時に利用しますが、今回は不要です。

    タグのセクションの設定は、任意でお願いします。

    最後まで設定が完了したら「設定」をクリックして設定完了です!

    CleanShot 2024-08-27 at 09.08.10@2x.png

実験

設定が完了したので、実験していきましょう!

Slackチャンネル「chatbot-test」にてコマンドを打っていきます。

※あらかじめ、IAMグループ「iam-group-outh」にユーザがいないことを確認しておいてください。

Slackにいき、chatbot-testチャンネルを開き、以下コマンドを実施します。

@aws lambda invoke
    --function-name lambda-chatops-auth
    --payload '{ "is_grant": true }'
    --region ap-northeast-1

以下のように返信が来るので、1件の返信をクリックし、スレッドを開きます。

CleanShot 2024-08-29 at 22.11.45@2x.png

スレッドには、以下のような返信が来ているので、「[Run] command」をクリックします。

CleanShot 2024-08-29 at 22.12.05@2x.png

以下のように返信されれば成功です!

CleanShot 2024-08-29 at 22.12.23@2x.png

実際にIAMグループ「iam-group-outh」を確認します。

うまく登録されていました。成功ですね。

CleanShot 2024-08-29 at 22.22.08@2x.png

グループから外したいときは、{ "is_grant": false }としてあげれば外すことができます。

@aws lambda invoke
    --function-name lambda-chatops-auth
    --payload '{ "is_grant": false }'
    --region ap-northeast-1

以上で完了です。

まとめ

今回は、Slackから直接AWSのIAMグループ管理を行う方法を紹介しました。これで、わざわざAWSにログインしなくても、チャットでサッと権限管理ができるようになります。時間も節約できて、業務効率もアップ間違いなし!ぜひ試してみて、権限管理をもっとラクにしちゃいましょう!

Discussion