ドキュメントルート配下のコンテンツをGitを用いてデプロイする時のセキュリティ上の注意点
技術スタック セキュリティインフラGit

ドキュメントルート配下のコンテンツをGitを用いてデプロイする時のセキュリティ上の注意点

2022.04.21

こんにちはjunです。最近関わっているプロジェクトではGitを用いた本番環境での運用を行っています。本番環境にgitを置くことによってgit pullするだけで改修したコードをすぐに反映できます。さらにブランチを分ければABテストや選択的なデプロイなども行えます。そのためシステム開発においてはGitによる本番環境での運用は欠かせません。

Laravelの様なシステム以外にも最近はwordpressのカスタムテーマやカスタムプラグインをgit管理し、本番環境にpullすることがあります。しかしその際の設定によってはプライベートのソースコードが流失したり、書き換えられたりなどセキュリティインシデントを犯しかねない設定になることがあります。私が公開前に止められたヒヤリハットとしてぜひ共有したいと思います。

今回解説するGitの管理と運用は以下のとおりです。

  • プライベートリポジトリ
  • リモートはgithub
  • 管理しているソースはwordpressのカスタムテーマ
  • .gitがドキュメントルート配下にある
  • サーバはxserver(法人用レンタルサーバ)

今回何が危なかったのか?

まず結論から先に述べますと「パーソナルアクセストークンを用いたgit設定がドキュメントルート配下にあった」ことです。わかる人は結構やべーとわかるかもしれません。取り合えず解説していきます。

パーソナルアクセストークン(PAT)とは

パーソナルアクセストークンとはgithubにて使用されるパスワードの代わりとなるアクセストークンです。参考

一昔前はプライベートリポジトリにURL(HTTP)でアクセスする場合はドメインの部分にGithubアカウントのIDとパスワードを合わせる方法がとられていました(Basic認証)。ただしその方法はセキュリティ上危ないので、廃止され現在はパーソナルアクセストークン という予測がしづらく、行える操作スコープと使用期限が設定されたトークンを発行してパスワードの代わりに使用する様になりました。

そしてgitはpull,pushなどを行う際にそのorigin(リモートリポジトリ)のURL(HTTP)かSSHを使用します。SSHは環境によって難しかったり設定が大変なこともあり、PAT付きのURLを用いて接続すると簡単にプライベートリポジトリに接続ができます。基本的にパーソナルアクセストークン はこの様にgithubのアカウントが必要なプライベートリポジトリの読み取り、リポジトリ操作を行う際に使用します。

今回のテーマファイルのリポジトリはもちろんプライベートなので、トークン付きのURLかSSHで接続する必要があります。そして今回はPATをメインに使用して、gitの操作を行っていました。

git設定ファイルとは

git設定ファイルとはリモートリポジトリ の接続先、ブランチ構成、ユーザーなどgit管理に必要な設定ファイルのことです。git initしてローカルリポジトリ を作成した際にls -laと打つと、.gitという隠しディレクトリが表示されます。それが設定ディレクトリであり、中に移動すると.git/configという設定ファイルがあります。

先ほどのパーソナルアクセストークンを用いたURLなどはその.git/configに書かれます。実際にlessやcatを使用してみてみると、リモートのURLなどが記載されています。

なぜ読み取れた?

今回gitで運用しようとしていたwordpressのテーマファイルはドキュメントルート配下に設定します。ルートからみて /wp-content/themes/customというリポジトリ名にもなるテーマディレクトリを作成してそこにgit initをして接続先の情報を記載しました。上記のとおりPATを用いています。

インフラに詳しい人ならわかると思いますが、基本的にドキュメントルート配下のファイルは.htaccessApacheで何かしら設定されていない場合、自由にみることができます。本来アクセスされない様なファイルにも例えば、https://example.comm/wp-content/themes/custom/.git/configとURLでアクセスすると読み取れることがあります。

xserverの場合はconfigファイルがダウンロードされ、もちろん接続先情報は記載されていました。そのためパーソナルアクセストークン が記載されたgitの設定ファイルが第三者にダウンロード可能な状態で公開しうるとこでした。

どうゆうことが起きかねる?

仮に公開し、攻撃者がこの存在に気づくと何が起こり得るでしょうか?まず、パーソナルアクセストークン が盗まれリポジトリに対して不正アクセスされます。まだwebサーバを通じて設定ファイルを読み取っただけなので、gitコマンドを打たれて本番環境を破壊されることはないと思いますが、プライベートリポジトリに何かしらの攻撃をされるでしょう。本来プライベートなリポジトリ の情報を取得されてしまうのです。

またパーソナルアクセストークン には操作範囲を設定できます。今回のはリポジトリに対する読み書き操作でしたが、他にも管理者権限レベルの操作を付与できるスコープもあります。つまり、権限の強いトークンの場合はリポジトリ の内容が盗まれたり改変されるだけでなく、アカウント全体に影響が出かねないものになります。

対策

ドキュメントルート配下にリポジトリを設定する場合は設定ファイルにアクセスできない様にする必要があります。またはPATを記載しないことです。

.gitディレクトリへのアクセスを404にする

まず手取り早くできるのは.htaccessにて.gitを含むURLがあったら404にしてしまうことです。

RedirectMatch 404 /\.git

こちらのStacoverflowが役に立ちました。

解説によると

  • ドキュメントルート配下すべての.gitディレクトリ (設定ファイル)へのアクセスを禁止できる。つまり複数のリポジトリがあっても一気に対応可能。
  • .gitignore.gitmodulesにも対応できる。
  • これから新しく追加される.gitにも対応できる。
  • 404にすることでリポジトリ の存在を悟らせない。

実際に.htaccessで設定すると、https://example.comm/wp-content/themes/custom/.git/configへのアクセスは404になりました。上記の設定の場合はURLに.gitが含まれた瞬間、404になるのがコツです。さすがにないと思いますがURLに.gitを使用するコンテンツがある場合も404になるのでそこは注意が必要です。

webサーバによる読み取りとgitコマンドは関係ないので、上記の設定をしたとしてもgit pullなど操作は引き続き使えます。

SSHに切り替える

また可能であればSSHによる接続に切り替えることです。SSHによる接続のURLはgit@github.com:example:repository.gitとなります。前半のgit@github.comはsshのgitユーザーでgitub.comに接続するという意味です。そのユーザーで接続する際の秘密鍵やそのパスの設定はwebサーバーからは読み取ることができません。(上記のURLに直に書いてればべつだけど)

そのためパーソナルアクセストークンよりかはSSHでGitに接続するほうが安全性的にかなりベストです。PATより堅牢な方法です。

ちなみに本番環境からリポジトリへSSHで接続する際はデプロイキーを使用するべきです。デプロイキーは特定のリポジトリのみのアクセスに限定するとともに、読み込み専用にすることができます。

PATでは読みに加えて書き込み権限と付与すればその他の管理者権限が使用できます。つまり盗まれた際の被害が甚大に対して、デプロイキーは特定のリポジトリ の読み込み権限のみを許可出るので被害が小さく済みます。

対策まとめ

一番はwebサーバーで.gitに対するアクセス権限をなくすことです。これでパーソナルアクセストークンであっても外部から見られる心配はありません。ただし可能な限りまずはより安全なデプロイキーによるSSHで接続できる様にし、かつwebサーバの設定を行うことがベストです。

うちは大丈夫?チェック方法(linux)

まずはドキュメントルート配下に.gitがいるかをチェックしましょう。Linuxの場合はドキュメントルート配下に以下のコマンドで探せます。

find /DOCUMENT/ROOT/ -name .git -type d

もしあった場合

/DOCUMENT/ROOT/wp-content/themes/example/.git

このように結果が出てきますので、URLに載せて

https://example.com/wp-content/themes/example/.git
https://example.com/wp-content/themes/example/.git/config

の2種類にアクセスしてディレクトリ 、configが閲覧されるかをチェックしましょう。サーバによっては対策済みの場合があります。

見れてしまったらまず.htaccessで閲覧できなくしましょう。中を見てパスワードやパーソナルアクセストークンがあったら今すぐ対処が必要です!!

Copyright © 2021 jun. All rights reserved.