こんにちはjunです。最近関わっているプロジェクトではGitを用いた本番環境での運用を行っています。本番環境にgitを置くことによってgit pull
するだけで改修したコードをすぐに反映できます。さらにブランチを分ければABテストや選択的なデプロイなども行えます。そのためシステム開発においてはGitによる本番環境での運用は欠かせません。
Laravelの様なシステム以外にも最近はwordpressのカスタムテーマやカスタムプラグインをgit管理し、本番環境にpullすることがあります。しかしその際の設定によってはプライベートのソースコードが流失したり、書き換えられたりなどセキュリティインシデントを犯しかねない設定になることがあります。私が公開前に止められたヒヤリハットとしてぜひ共有したいと思います。
今回解説するGitの管理と運用は以下のとおりです。
まず結論から先に述べますと「パーソナルアクセストークンを用いたgit設定がドキュメントルート配下にあった」ことです。わかる人は結構やべーとわかるかもしれません。取り合えず解説していきます。
パーソナルアクセストークンとはgithubにて使用されるパスワードの代わりとなるアクセストークンです。参考
一昔前はプライベートリポジトリにURL(HTTP)でアクセスする場合はドメインの部分にGithubアカウントのIDとパスワードを合わせる方法がとられていました(Basic認証)。ただしその方法はセキュリティ上危ないので、廃止され現在はパーソナルアクセストークン という予測がしづらく、行える操作スコープと使用期限が設定されたトークンを発行してパスワードの代わりに使用する様になりました。
そしてgitはpull,pushなどを行う際にそのorigin(リモートリポジトリ)のURL(HTTP)かSSHを使用します。SSHは環境によって難しかったり設定が大変なこともあり、PAT付きのURLを用いて接続すると簡単にプライベートリポジトリに接続ができます。基本的にパーソナルアクセストークン はこの様にgithubのアカウントが必要なプライベートリポジトリの読み取り、リポジトリ操作を行う際に使用します。
今回のテーマファイルのリポジトリはもちろんプライベートなので、トークン付きのURLかSSHで接続する必要があります。そして今回はPATをメインに使用して、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を用いています。
インフラに詳しい人ならわかると思いますが、基本的にドキュメントルート配下のファイルは.htaccess
やApache
で何かしら設定されていない場合、自由にみることができます。本来アクセスされない様なファイルにも例えば、https://example.comm/wp-content/themes/custom/.git/config
とURLでアクセスすると読み取れることがあります。
xserverの場合はconfigファイルがダウンロードされ、もちろん接続先情報は記載されていました。そのためパーソナルアクセストークン が記載されたgitの設定ファイルが第三者にダウンロード可能な状態で公開しうるとこでした。
仮に公開し、攻撃者がこの存在に気づくと何が起こり得るでしょうか?まず、パーソナルアクセストークン が盗まれリポジトリに対して不正アクセスされます。まだwebサーバを通じて設定ファイルを読み取っただけなので、gitコマンドを打たれて本番環境を破壊されることはないと思いますが、プライベートリポジトリに何かしらの攻撃をされるでしょう。本来プライベートなリポジトリ の情報を取得されてしまうのです。
またパーソナルアクセストークン には操作範囲を設定できます。今回のはリポジトリに対する読み書き操作でしたが、他にも管理者権限レベルの操作を付与できるスコープもあります。つまり、権限の強いトークンの場合はリポジトリ の内容が盗まれたり改変されるだけでなく、アカウント全体に影響が出かねないものになります。
ドキュメントルート配下にリポジトリを設定する場合は設定ファイルにアクセスできない様にする必要があります。またはPATを記載しないことです。
まず手取り早くできるのは.htaccess
にて.git
を含むURLがあったら404にしてしまうことです。
RedirectMatch 404 /\.git
解説によると
.gitignore
や.gitmodules
にも対応できる。実際に.htaccess
で設定すると、https://example.comm/wp-content/themes/custom/.git/config
へのアクセスは404になりました。上記の設定の場合はURLに.git
が含まれた瞬間、404になるのがコツです。さすがにないと思いますがURLに.git
を使用するコンテンツがある場合も404になるのでそこは注意が必要です。
webサーバによる読み取りとgitコマンドは関係ないので、上記の設定をしたとしてもgit pull
など操作は引き続き使えます。
また可能であれば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サーバの設定を行うことがベストです。
まずはドキュメントルート配下に.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
で閲覧できなくしましょう。中を見てパスワードやパーソナルアクセストークンがあったら今すぐ対処が必要です!!