質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.76%

公開ディレクトリに.gitディレクトリを置くのはセキュリティとして問題でしょうか?

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 5,351

t.tohda

score 15

古い記事ですが、gitで本番環境にデプロイするのはセキュリティ上問題なのかと悩んでいます。
【警鐘】1/600の割合でWebサイトが「.git」ディレクトリを公開している事が判明 | ソフトアンテナブログ

現在の運用方法は、本番環境(例:/var/www/html/)にGitHubからgit cloneして、更新がある毎にgit pullで反映しています。

そうすると、
/var/www/html/hoge/.git というディレクトリが本番環境にできてしまいます。
パスワードや個人情報などはgitで管理していませんが、一般的な方法があれば教えてほしいです。

また、
/var/www/html/hoge/package.jsonなどの設定ファイルも置かれてしまいますが、アクセスして参照できるのはどうなのかも教えて欲しいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

Webサーバの機能で.gitディレクトリを隠す方法が紹介されていますね。
https://stackoverflow.com/questions/25001405/git-having-server-git-repo-push-to-public-html

別のやり方で.gitディレクトリを非公開ディレクトリに置くパターンもありかと

/var/www/public_html が公開ディレクトリ
/etc/gitdir は.git内ファイルを置く(置かれるの方が正しい?)ディレクトリとした場合

 clone

cd /var/www/public_html
git clone --separate-git-dir /etc/gitdir https://hogehoge/hoge.git

 pull 

cd /var/www/public_html
git --git-dir=/etc/gitdir pull

package.jsonも見せる必要が無いので隠したいですが思いつきません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/28 22:29

    --separate-git-dir というオプションがとても参考になりました。

    すでに.gitがある状態だったのですが、
    $ git init --separate-git-dir=/tmp/hogehoge
    とすると、現在のリポジトリ内容を保ったまま、外部に.gitを移すことができました!

    ありがとうございます!

    キャンセル

+2

.git/configとGitの履歴に秘匿したい情報が一切なければ良いんじゃないでしょうか?
不味い例の一つとして、GitHubからクローンする時にhttpsの場合はベーシック認証の情報を埋め込む事が可能だったりします。

  • 一般的な方法: git clone https://github.com/miyabisun/dotfiles.git
  • ベーシック認証: git clone https://miyabisun:password@github.com/miyabisun/dotfiles.git

後者のようにすると、git pullgit push等でいちいちパスワードを聞かれずに済んで楽なんですよね。
ところが.git/configファイルを確認すると…
url = https://miyabisun:password@github.com/miyabisun/dotfiles.git
そのまんま格納するんかい! はいアウト。

.htaccessファイル(apache時)等でガチガチに守る方法もありますが、
ファイルやディレクトリの増減への対応が難しいので、そもそも公開領域に.gitを置かない方が良いでしょうね。

一般的な方法があれば教えてほしいです。

私がよく配置しているディレクトリ構成はこんな感じです。

/var/www/[プロジェクト名]/
  .git/
  public/
    index.html
    css/
      style.css
    js/
      bundle.js
  src/
    templates/
      index.pug
    stylesheets/
      style.sass
    scripts/
      main.ts
  package.json

まぁ、/var/wwwの配下にある必要もないので何処でも良いですが、流石に/var/www/htmlはやめましょう

対応策ですが色々あります。
本番環境がgit pullしたいだけならば、public/配下の生成したファイルもgit管理下に置いて構いません。

  • 元からある/var/www/htmlディレクトリは削除、/var/www/[プロジェクト名]/publicのシンボリックリンクにすげかえ
  • httpd.conf(apache時)を修正して公開領域を/var/www/[プロジェクト名]/public配下に変更

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/28 22:24

    .git/configファイルにパスワードも記載されるとは知りませんでした。

    Basic認証つきでcloneすることは今のところ想定していませんが、やはり公開ディレクトリには最低限のファイルだけ置くようにします。

    ディレクトリ構成もとても参考になりました。ありがとうございます!

    キャンセル

check解決した方法

0

みなさんの意見を参考に模索してみました。
懸念点などあれば教えてもらえると助かります。

 試したこと

/var/www/html/.git が既にある場合です。

$ git init --separate-git-dir=/home/users/hoge
Reinitialized existing Git repository in /home/users/hoge/

上記コマンドで、ワークスペースは /var/www/html/ のまま、
/home/users/hoge というリポジトリのディレクトリが作成されました。

元々あった /var/www/html/.gitはファイルに変更され、リポジトリの場所が記載されていました。

$ ls /home/users/hoge
COMMIT_EDITMSG  HEAD            branches        description     index           lfs             objects         refs
FETCH_HEAD      ORIG_HEAD       config          hooks           info            logs            packed-refs

$ cat /var/www/html/.git
gitdir: /home/users/hoge

 最終的にやったこと

.gitの場所を非公開ディレクトリにするだけでは、結局 package.json とか README.md が公開ディレクトリに置かれるので、どうしようかと思い行き着いた結果です。

  • 開発ディレクトリ内に公開用ディレクトリを置く
  • 本番環境には特定ディレクトリのみpullする

参考:Gitで特定のディレクトリだけcloneする方法 - Qiita

リモートリポジトリの構造
repo/
├ public/
│ ├ index.html
│ └ style.css
├ src/
│ ├ index.html
│ └ style.scss
├ tests/
├ .git
├ .gitignore
├ README.md
├ ...
└ package.json

本番環境には/var/www/html/.git が既にある状態です。

$ git config core.sparsecheckout true

# pull したいディレクトリ(/public)を書きます。
$ vi .git/info/sparse-checkout

$ cat .git/info/sparse-checkout
/public

# このコマンドを打つと、/public のみになります。
$ git read-tree -m -u HEAD

# リポジトリのディレクトリを非公開範囲に変更します。
$ git init --separate-git-dir=/home/users/hoge
Reinitialized existing Git repository in /home/users/hoge/

Git - git-read-tree Documentationより。
read-tree - ツリー情報をインデックスに読み込みます。
gitのread-treeが返ってくると、矛盾しているパスだけが結合解除状態になります。

-m
読み込みだけでなく、マージを実行します

-u
マージが成功したら、マージの結果をワークツリー内のファイルに更新します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る