Bot Application のソースコードを GitHub で公開する時に秘匿情報を含めない方法

別に Bot Application に限った話ではないのですけどね。

Microsoft の Bot Framework を使った Bot Application の作成方法は、いくつかWebで公開されていますが、それらに沿って作成したソースコードを GitHub などの誰でも閲覧できるリポジトリで管理・公開すると、本来公開すべきでない以下の情報が含まれてしまいます。

  • Bot Directory へ登録する際に発行される「Bot ID」, 「App ID」, 「App Password」
  • Azure へ発行する際の設定情報

これらをソースコード管理に含めないようにする方法を紹介します。

「Bot ID」, 「App ID」, 「App Password」 をソースコード管理に含めないようにする

たとえば、

では、BotのIDやパスワードなどを、Web.config<app key="BotId" などに設定するよう書かれています。 実際プロジェクト作成直後の Web.config を見ても "YourBotID" などと書かれており、「ここに書くのが当然」感を醸し出しています。これがよくない!

<!-- Web.config -->
<configuration>
    <appsettings>
    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->
    <add key="BotId" value="YourBotID" />
    <add key="MicrosoftAppId" value="" />
    <add key="MicrosoftAppPassword" value="" />
    </appsettings>
: (略)

Web.config 及び Web.Debug.config, Web.Release.config は、 ASP.NET の Webアプリケーションに関する設定を記述するもので、ソースコード管理に含めるべき情報です。 ここにIDやパスワードを記述してはいけません

ではどこに記述するかというと、

で紹介されている方法を使って、別のファイルに逃します。

具体的には、

  1. 新たに Web.local.config というファイル(ファイル名は何でもよい)をプロジェクトに追加し、秘匿情報を含む XML のブロックはそちらに記述する
  2. Web.config に上記ファイルへの参照を記述する

とします。

Web.local.config は、 Web.config などと同じディレクトリに追加し、ビルドアクションを「コンテンツ」とします。

avoid secrets from github in your bot application project 01

Web.local.config の内容は以下です。

<!-- Web.local.config -->
<appSettings>
  <add key="BotId" value="<あならのBOTID>" />
  <add key="MicrosoftAppId" value="<あなたのMicrosoftAppId>" />
  <add key="MicrosoftAppPassword" value="<あなたのMicrosoftAppPassword>" />
</appSettings>

Web.config に記述していた <appSettings> 要素を切り出してきた感じですね。

そして、 Web.config を次のように修正します。

<!-- Web.config -->
<configuration>
  <appSettings file="Web.local.config">
    <!-- 秘匿でない設定情報があればここに書く -->
  </appSettings>
: (略)

<appSettings file="Web.local.config"> と記述することで、Web.local.config の内容をここに注入できます。

あとは Web.local.config.gitignore に追加するなどしてソースコード管理対象から除外します。 Web.local.config が存在しなくてもビルドや実行はできるようですが、初見の人には不親切なので、 README.md で補足説明をしておくのがよいでしょう。

開発用とプロダクト用で 「Bot ID」, 「App ID」, 「App Password」 を切り替える

前の手順で設定したID、パスワードなどは「開発用」の情報です。 Azureに配置した本番環境では、別のID、パスワードを使用したいケースは普通にあります。 本番環境の設定はAzureポータルから行えます。

avoid secrets from github in your bot application project 02

この図のように、

  1. Azure ポータル(https://portal.azure.com/) で、配布した Bot Application(App Service) を開き、さらに「アプリケーション設定」を開きます
  2. 「アプリ設定」で、 本番用の「Bot ID」, 「App ID」, 「App Password」を追加します
  3. 最後に「保存」を押します

ここで設定した内容は、配布した Web.config にある <appSettings> の内容を上書きします。

Azure へ発行する際の設定情報をソースコード管理に含めないようにする

Visual Studio 2017 は、IDE から Azure への発行ができてとても便利なのですが、発行のための情報も保持してしまうので、その際の情報もソースコード管理に含めるべきではありません。

avoid secrets from github in your bot application project 03

これらの情報はプロジェクトのディレクトリの Properties\PublishProfiles というサブディレクトリに、 *.pubxml, *.pubxml.user というファイル名で保存されるようなので、このディレクトリ毎、あるいは個別のファイルを .gitignore に追加すればよいです。

まとめ

  • Web.config には秘匿情報を書かない
  • Web.local.config を作って、そちらに書く、このファイルはソースコード管理しない
  • 本番用のIDやパスワードはAzureポータルで設定する
  • Azureへ発行する際の設定情報もソースコード管理しない

結果、 .gitignore に次の2行を追加するとよいです。

# .gitignore
<省略>

*.local.config
PublishProfiles/

手前味噌ですが、上記以外の .gitignore の設定は https://www.gitignore.io/ で "VisualStudio" と検索して生成されるものを使用すると便利です(上の2行が含まれているわけではありません)。