2023/06/07

AWS CLIでSSOログインするときのちょっとお役立ち情報

ごく稀に書くお役立ち情報シリーズです。

  • AWS CLIでSSOログインするときに開くブラウザを指定したい
  • それをsshのProxyCommandに仕込んでEC2のtcp/22ポートをフルオープンせずSSHしたい

というお話です。

最近うちの会社にもSSOできるIdPが導入されたのでAWSもSSOできるようにする流れが来ています。それに先立ち技術調査…というわけでもないですけど、せっかくだし自分の個人のAWSアカウントもSSO出来るようにするか〜ということで、個人のGoogle Workspace(無償版G Suiteで使ってたやつ)をIdPにしてAWS SSOを設定しました。ちなみにAWS SSOは最近名前が変わってAWS IAM Identity Centerになりましたが、この記事ではとりあえず略して(馴染みのある名前で)AWS SSOと呼ぶことにします。

さて、AWS SSOを設定してGoogleアカウントでログインできるようにしたのはいいとして、そもそも元々自分の個人のAWSアカウントとGoogle WorkspaceはSAML連携の設定をしていたので単純にAWS SSOでAWS Console入れるようにしただけだとむしろクリック数が増えてて旨味がありません。

じゃあなんでAWS SSOを設定したかというと、AWS CLIでSSOログインできるようになって、そうするとお手元にIAM Userのアクセスキーなどを持たなくてよくなるというところが主な狙いです。セキュリティの向上ですね。必要に応じて aws sso login したときに初めて有効期限つきのクレデンシャルがふってくるので、万が一なにかがどうにかなっちゃったとしても、クレデンシャルに有効期限がついていれば被害の軽減に役立ちます。

AWS CLIのSSO設定は、 aws configure sso とかをやればいいのでドキュメントを読みながら設定すればサクッといけます。一通り設定したあとは、SSOセッションの有効期限を調整して使い始めればOKです。私はあまり短すぎてもイライラするので、18時間に設定して aws sso loginしたらその日いっぱいは再ログインしなくても使えるみたいな感じにしています。

これで必要に応じて aws sso login すればブラウザが開いてIdPで認証をし、ブラウザでAllowをポチっとおせばクレデンシャルが降ってくる感じになりました。便利ですね。これでもうIAM Userのアクセスキーはいらん! ということで私はこれの設定をしたら速効でアクセスキー無効にしました。

AWS CLIのSSOログインのブラウザを指定したい

ところで、私の環境依存の話ではあるのですが、このフローにはちょっと不満があります。AWS CLIが開くブラウザはデフォルトブラウザで、デフォルトブラウザに複数のGoogleアカウントでログインしていると、毎回Googleアカウントを選択しないといけないんですよねぇ。クリック数が1回増えるし、手が滑ってIdP設定してないアカウントをクリックしてしまうと403エラーになるしでいいことがありません。起動するブラウザを指定できれば、1個しかGoogleアカウントを使ってないブラウザを起動してAllowを1回クリックするだけでいいようにできるのですが… というのが今日の本題です。

その辺ググってみると、AWS CLIのGithubリポジトリにそれっぽいissueがあったりもするのですが、GUIセッションがない端末用に --no-browser フラグを追加するのは対応されましたが自由にブラウザを指定するフラグなどは用意されませんでした。

そのissueには「WSLだと環境変数BROWSERを設定したら指定できるぜ」みたいな事が出てきたりして一体それはどういう仕組みなんだみたいな感じになったのでAWS CLIのソースをたくさん読んでみたところ、AWS CLIがブラウザを起動するのは最終的にPython3のwebbrowserモジュールに任せていることがわかりました。で、このドキュメントを読んでいくと「環境変数 BROWSER が存在する場合はデフォルトのブラウザリストに先立ちこっちを試す」みたいなことが書かれています。そういうことね!

環境変数で起動したいブラウザのパスを設定すればいいのは分かりましたが、わたしがブラウザ起動したかったのはmacOSなので、ちょっと一手間必要です。macOSのコマンドラインからGUIのアプリを起動するにはopenコマンドを使います。Safariを起動するなら open -a Safari とかになります。で、これをそのまま環境変数BROWSERに設定してもうまく行かないので、結論としてはシェルスクリプトにして、環境変数BROWSERにはそのシェルスクリプトへのパスを設定しましょう、という感じになります。

#!/bin/sh

open -a "Safari" $@

こんな感じのシンプルなシェルスクリプトを作って run_browser.sh とかのファイル名でどこかに保存しておき、+x パーミッションを付けておきます。これを環境変数BROWSERに設定してやればOKです。BROWSER=$HOME/run_browser.sh aws sso login を実行すれば、デフォルトブラウザではなく、ちゃんと run_browser.sh で設定したブラウザでIdPにアクセスしにいくはずです。

ssm-agent経由のSSHログインにaws sso loginを挟みたい

個人のAWSアカウントに立ってるEC2にsshするのをssm-agent経由で出来るようにして、EC2を0.0.0.0/0に対して22番ポートあけるのをそもそも辞めたいみたいなことを考えていたので、その辺も叶える~/.ssh/config をこんな感じで書いています。これは、AWS CLIのpowawaというプロファイルを利用し、SSOセッションが期限切れだったらaws sso loginする、そうじゃなければ普通に aws ssm start-session する、というようなコマンドラインです。

host my-ec2
    user XXXX
    hostname i-00XXXXXXXXXX
    ProxyCommand sh -c "(aws sts get-caller-identity --profile powawa || BROWSER=$HOME/run_browser.sh aws sso login --profile powawa) && aws ssm start-session target %h --document-name AWS-Start-SSHSession --parameters 'portNumber=%p' --profile powawa"

この設定を書いておいて ssh my-ec2 とやると、

  • AWS CLIのSSOセッションが生きてるか確認して
  • 生きてなかったらブラウザを開いて aws sso loginして
  • aws ssm start-session してssm-agentをつかってProxyCommandにポート転送する

という感じでSSH接続が確立できます。体感としてはsshコマンドを実行するとブラウザが立ち上がってAllowするとSSH接続が確立する、という感じになります。~/.ssh/confighostname%h に展開されるので、hostname にEC2のインスタンスIDを書いておくというのがこの設定のチャームポイントです。

2023/03/27

YAPC::Kyoto 2023に参加しました

今回は本編前日の京都に来ました記事を書いておわりかな~とも思ったのですが、意外とブログ書く時間があったので参加後の記事も手短にお届けします。

4年ぶりのYAPC、ということでオフラインの技術カンファレンス筋が鈍っているというのもありますが、諸事情がいろいろあり今回は交流とかのところはバサッと捨てて時間がとれる限りトークを聞く、というところに集中していくことにしました。

個人的には昔から一貫してマルチトラックのカンファレンスでは「聴き終わったあとにコード書きたくなりそうなやつを聴く」というポリシーのため今回もあんまりエモなトークにはいかずに実践的なテックトークをいろいろ聴きました。

  • 2023年春のPerl
  • tRPCとCloudflare PagesとCloudflare D1で実現する 安くて速くて堅牢なWebアプリケーション
  • ORM - Object-relational mapping
  • “普通”のWebアプリでWASMを活用する
  • Perlと全文検索エンジンGroongaでMySQLのデータを高速に全文検索する
  • 法と技術の交差点

一番最後のやつだけは別にコード書きたくなりそうなやつではないんですが、いまは本業が経営企画兼エンジニアになっているので法律系もカバーしたいということでそちらに行きました。

YAPCはもともとPerlのイベントだけど、もはやPerl「中心」なのでPerlじゃなくてもよき、というところもあって普通に聴いてるだけで手を動かしたくなる話、今後のことを考えたくなる話がいろいろ聴けるのがいいですね。

今回は懇親会がないので人と話してトピックを収集するというよりは本当に自分の周辺知識とか世間の潮流とかをアップデートするための時間として過ごしたという感じで、久々に昔のYAPCに行ったときに似た感じで過ごした感じがします(他の人とほとんど話さず一人で黙々といろいろ聴いたという意味で)。ホントに、自社のブース以外だと会場でお久しぶりな元社員2〜3人と話した以外はほとんど話してないので逆に新鮮という感じになりました。

そういえば、私はいつもメガネかけてるところですが今回はコンタクトで行ったのでマスクしてるとそもそも気付かれないみたいな説もありそうだな、と思いました(逆にぼくもジョーに話しかけられたときに2秒くらい気付かなかった)。単純にオフラインのイベントが数年ぶりというところに加えてみんなマスクつけてるからよく見る人じゃないと全然気付かないみたいなの、結構あったかとおもいます。

京都旅行として

京都自体が3年ぶりなのですが、よく行くエリアはそんなに変わらず、いつもの京都だな〜という感じでした。もちろん四条の通りを歩いているといろいろとお店が変わってるなと気付くところもありましたが、もっと全体的な感じでみていくと8割くらいは変わってない感じがしたので、そういう意味では安心してブラブラ歩けました。

京都に行くと2回に1回くらいは八坂神社にいくようにしているので今回も八坂神社に寄りまして、そのまま丸山公園に行ったらしだれ桜がいい感じになっていました。これまで、大体京都に行くのはイベントの関係で5月か12月になることが多いので春の京都はたぶん初だった気がしており、春の京都は混んでそうだからいかない、となりがちな性格なのでこういう機会で春の京都に来られたのはよかったな〜と思いました。

うされもん @acidlemonについて

|'-')/ acidlemonです。鎌倉市在住で、鎌倉で働く普通のITエンジニアです。

30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。

外部サイト情報

  • twitter
  • github
  • facebook
  • instagram
  • work on kayac