atlantisでterraformを実行する際のセキュリティ
これは何
terraformを実行する環境として、atlantisを使うことがある。atlantisを使う際には、気をつけて使わないと、意図せず権限を持たない人が強い権限で処理を実行できてしまう。
atlantisとは
GitHub, GitLab, Bitbucket, Azure DevOpsなどと連携をして、terraformをPull Request / Merge Requestから実行できるサービス。atlantisのprocessをどこかにサーバとして立ち上げておき、PR/MRが出た際のWebhookをatlantis serverに送ることで、terraformを実行できる。
atlantisでterraformを実行する際は、PR/MRが作成されたタイミングや、それ以外にもPR/MRに atlantis plan
/ atlantis apply
のようなコメントを書くことで、そのPR/MRにdiffのあった部分のみterraformを実行できる。
atlantisの設定ファイルについて
前提として知るべきこととして、atlantisには以下の2種類の設定ファイルがある。
- Server Configuration
- atlantisをdeployする側で管理を行い、atlantis自体の設定ファイルを記載したもの
- Repository Configuration
- repositoryで管理を行い、そのrepositoryにおける設定を記載したもの
Server Configurationはatlantis管理者が設定を行い、Repository Configurationはrepository管理者が行うことになる。つまり、Server Configurationで制限をかければ、各repositoryの利用者が不用意にatlantisを利用するのを制限することができる。
atlantisにおけるSecurity考慮事項
atlantisにおいて考慮すべきSecurity事項とは何があるのか?
実際にterraformを実行するのがatlantisのサーバーになるため、atlantisのサーバには強い権限がつくことが多い。この強い権限を、権限を持たない人が意図せず使えてしまうことは避けねばならない。一番簡単な例として、publicなrepositoryを使い、atlantisと連携を行った結果、任意のterraform resource削除のPR/MRを誰かが出して、そのPR/MRからその人がatlantis経由でterraform apply出来てしまうような状況も設定次第では作れてしまう。
主として考えるべき事項は、publicなrepositoryやfork先、指定するrepository以外では利用させない
、approveされた状態においてでしか、apply出来ないようにする
などといった対応があるが、今回はさらに planにおける制限をする
ということをメインに話したい。
applyにおける制限をする
terraform apply
を承認された状態でしか実行できないようにするには、以下の設定をすれば良い。
一方で、後述するようにterraformはplanにおいても任意のコードが実行できてしまうため、この設定だけでは不十分。
planにおける制限する
PR/MRを任意の人が出した場合にplanを自動で実行して、承認がされればapplyが実行できる、みたいなユースケースがありえそうなものではある。
残念ながら、terraform apply
を apply_requirements
で防いだとしても、terraform plan
がautoplanなどにより実行されてしまう状態ならば、任意のコードが実行出来てしまう。
terraformには local_exec という機能がある。これはコマンドを実行した結果をterraform内で利用できるものであり、以下のようなケースで非常に便利なものになっている。
- localのファイルを読み込む
- 動的に変わる設定/IPなどをcurl等で読み込む
しかし、このlocal_execでは自由にコマンドがかけるため、autoplanが有効なrepositoryにおいては、任意のlocal_execを書いてPR/MRを出すだけで、atlantisの強い権限を悪用出来てしまう恐れがある。この対応のためには、以下のようにplan出来るユーザを制限する、利用するterraform resourceを制限する、といった対応が考えられる。
atlantis planをできるユーザを制限する
そもそも任意の人のPR/MRに対して、autoplanが走ってしまうことが問題なため、plan自体を特定のユーザでしか利用させない案がある。
atlantisではServer Configuration及びRepository Configurationの双方でplan/apply時の処理を workflows
として記述することが出来る。Server Configurationでこのworkflowsを定義してしまい、そのworkflowsの中で、該当PR/MRのplanは権限のあるユーザのみしか実行できないような処理を入れることが出来るし、前処理としてPre Workflow Hookとして記載することも出来る。
atlantisを実行する際にはGitHub, Gitlab等へコメントをするためにAPI Tokenが発行されているため、そのtokenを利用してatlantisを実行しようとしたユーザと、そのrepositoryの属するgroupの突き合わせを行い、Owner等の権限をユーザが持っていれば実行できる、といった処理を書けばいい。
利用するterraform resourceを制限する
上記のユーザを制限する対応が出来ることが望ましいが、一方で任意の人にPR/MRを出してほしいterraform repositoryの場合にはautoplanが無いと不便が生じる。
atlantisではConftestを導入できるため、これにより利用出来るterraform resourceを制限すれば、任意の処理は実行できなくなる。blacklistでlocal_execを除くのも1つの手だが、リスクを考えるとwhitelistで利用して良いresource一覧を列挙する方が望ましい。
〆
この記事は FOLIO Advent Calendar 2021 - Adventar として書きました。弊社ではPrivateなRepository/Serverだからといって、意図せず強い権限を持ってしまうようなことを避けるような対応もしつつ、「技術と想像で"未来の金融"の礎となる」Visionを掲げて事業を展開しています。このようなサービス開発に興味のある人は、ぜひ会社紹介資料を参考にしつつ、以下のtwitterまでDMください。