tech.guitarrapc.cóm

Technical updates

Azure Functions - C# で安全に機密情報を渡そう

Azure Functions は、本当に各所で活用できるポテンシャルがあり、すでに多くの実績をグラニで積んでいます。実際グラニでは、プロダクト投入に加えてインフラにおける中心となりつつあります。活躍できるシーンが多く思いつくため、どんどん実装が追加されています。

さて本番投入ということで、検証ステージを超えると気になるのが機微情報(機密情報)です。

「慣れるため、開発中」などいろいろな理由でついついパスワードやToken などをコードに埋め込んでしまうことが多いと思います。

そんな時に、Linux では環境変数にexport Hoge="foo" などとしてコードから分離するのが王道ですが、Azure Functions でどうやってコードと分離するか考えてみましょう。

目次

目標

次のことができるように目指します。

  • Github や Bitbucket をはじめとする、ソースコードのバージョン管理システムに機微情報を含めない
  • CI で同一環境にデプロイする (Immutable に新たに Azure Functions を作成しなおすということはしない)
  • デプロイしたコードから機微情報へアクセスして利用できること

この目標のため、ソースコード内への生埋め込み、app.config などは利用できません。

AWS でもリソースアクセスはInstance Role *1 で制御が可能ですが、悩ましい問題です。

Azure Functions は Web Apps

Azure Functions ではどうするといいでしょうか?実体がWeb Apps、ということはつまり Application Settings (== 環境変数)が利用できます。

Application Settings に機微情報を埋め込む

Web Apps も Azure Functions も、IaaS ではなく PaaS です。とはいえ、Kudu 経由でシェルも触れるのですが、環境変数はシェルからは設定しません。PaaS ということはインスタンスの実体は隠蔽されており、いつ別インスタンスに変わるかはおまかせだからです。

シェルで設定 = 設定したインスタンスでしか参照できずインスタンスが変わると再設定が必要

ということはご理解いただけると思います。そこで利用するのが、App Settings です。これを利用することで、Web Apps が管理するインスタンスが何になっても、共通で参照する環境変数を定義し、インスタンスから参照できます。

さっそく Azure Functions で、App Settings にアクセスしてみましょう。

Function app settings > Settings > Application settings > App Settings

この App settings にKey/Value で環境変数を設定します。今回は、FooKey に対してFooValue です。

App Setting を読み込む

コードからは、App.config を読み込む際と同様に、System.Configuration.ConfigurationManager.AppSettings["<Key>"] で取得が可能です。

1つだけ注意点として、#r "System.Configuration" を追加しておきます。アセンブリが足りないため、System.Configuration;名前空間が参照できないためです。

あとはコードを実行してみます。

gist.github.com

予定どおり、FooKey に設定した FooValue が取得出来ていますね。

また App Settings は、#load "読み込みたい.csx" で指定した外部 .csx ファイルでも読めます。これは、.csx が Function のディレクトリではなく、WWWRoot にある場合でも問題ありません。

まとめ

今回の外部 App Settings 参照も、Github に追加しておきました。

github.com

機微情報をコードから除外できるのは、ソース管理から見るととても大きいです。もちろん Amazon Key Management SystemAzure Key Vault で、暗号化、復号化をするのもいいのです。

が、まぁ、App Settings を使うのが、Azure Functions では妥当ではないでしょうか。やりすぎず、必要十分は確実に満たす方法が用意されているのはいいですね。

*1:つまり IAM Role