Unity のセキュアソフトウェア開発ライフサイクル(SSDLC)の一環として、弊社の資格情報の管理戦略を共有したく思います。コードでトークン、キー、そして資格情報(別名シークレット)を管理するのは、かなり面倒な作業だと言えます。これらの点についての詳細を記すことで、私たちが辿ってきた道を捉えていただき、それがご参考となれば幸いです。
数年前、Unity セキュリティチームは、インフラチームの Unity パートナーと共同で、資格情報管理の問題に正面から取り組もうということで、パートナーそれぞれの狙いを定めることにしました。Unity のような多様で大規模な環境においては、プロジェクトは数多のプログラミング言語のうち、その 1 つで記述されて、複数の異なった環境で開発され、そして継続的に行われる統合化での大量のツールチェーンが配備されることになります。こうなってしまうと資格情報の管理はさらに大変で手間がかかる作業となってしまいます。本記事では、同じ問題を持つ皆さまの指標になればと、弊社のソリューションをオープンソース化するだけでなく、私たちが辿ってきた道程についても記述しております。
そう、資格情報は管理する必要があります。でも、それって何ですか? シークレットとも呼ばれる資格情報とは、リソースや他のサービスにおいての特権操作を実行する際にあなたが使用するサービス側から要求される部分、すべての情報です。これは、API のトークン、一部のサービスにログインするためのパスワード、外部サーバーに接続するための SSH 秘密鍵、ストレージバケットに書き込むための一連の資格情報、あるいはバイナリに署名するための RSA 鍵などが該当します。どんなタイプの資格情報であっても、対象の情報は慎重に守られて、使用対象となる処理に関わっている一部の当事者だけが知っている状態にしなければなりません。理想的には、そのサービスに取り組んでいる開発者ですら、知らない方が良いでしょう。最低でも、対象情報を必要なときだけ利用すべきなのです。
強固な資格情報管理戦略における 2 つの目標とは、資格情報が悪意のある当事者の手に渡らないようにすることであり、そして開発者にとって過度に複雑化するような作り方とならないように資格情報を取り扱うことです。しかし、それは口で言うほど簡単なことではありません。
資格情報管理戦略を確立するとなると、チームは以下のような一般的問題を事前に予測しておかなければなりません。
慎重な協議の末、弊社では米 HashiCorp 社の Vault を使うことを選択いたしました。この資格情報管理ソリューションのおかげで、私たちが抱えていた問題のほとんどに対処することができたのです。さらにオープンソースのソリューションとして利用できるバージョンも存在しています。
Vault では、安全に資格情報を保存し、それらに対して厳密な管理のもとにアクセスを行えるようにした上で、ユーザーが資格情報を取得出来るようにもできるソリューションを提供してくれます。残念ながら、開発者は資格情報を取得し使用するために、Vault ライブラリを自身のプロジェクトに統合する際、未だ手動で行う必要がありました。致命的なのは Vault はマトリョーシカ問題にまだ対処していなかったという点です。もちろん、資格情報を格納するための安全でセキュアな場所が得られましたが、それらの情報へのアクセスには、さらにトークンを必要とします。Vault の使用でより良い立場へと進むことはできるのですが、それでも問題をもう一段上のレベルに押し上げてしまうことも否めません。
依然として残る問題に対処するために、弊社ではいくつか既存のツールを検討しましたが、特にユーザーの使い勝手の良さなども考慮に入れると、要件すべてと合致するものはありませんでした。そのような事情から、私たちは Vault Secret Fetcher(VSF)を作成いたしました。 VSF は、GKE/Kubernetes または Google Compute Engine を通す形で認証を手配することで、コーディングにはびこる「マトリョーシカ人形問題」を一段階別に切り上げるように動作してくれます。その際、初期認証はオーケストレーションか、基盤となるインフラプラットフォームへ任せてしまえます。Vault では多様な認証メカニズムでの配列をサポートされているため、この動作は他のどんなインフラストラクチャでもサポートできるように調整が簡単になっています。
開発者のすることと言えば、Vault へシークレットを記述することだけです。
vault write secret/<YOUR PATH> token="..."
そしてサービスの環境でパスのプレースホルダーを割り当てましょう。
TOKEN = ‘VAULTSECRET::{"path":"secret/sre/dev/TEST", "key":"token"}'
資格情報のフェッチのフローは、以下のようになります。
このプロセスの詳細については、このプロジェクトの README をご覧ください。
オープンソースプロジェクトとして Vault Secret Fetcher をリリースいたします。ぜひともお試しいただき、プロジェクトにお役立ちいただけるような部分などご一考いただければと思います。弊社は皆様のご協力を心から感謝しております。
今後は、Vault Secret Fetcher をより一層使いやすいものにし、数多くのプラットフォームやユースケースをよりサポートできるようにする方法を模索していきます。
Is this article helpful for you?
Thank you for your feedback!