古い記事ですが、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などの設定ファイルも置かれてしまいますが、アクセスして参照できるのはどうなのかも教えて欲しいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
.git/config
とGitの履歴に秘匿したい情報が一切なければ良いんじゃないでしょうか?
不味い例の一つとして、GitHubからクローンする時にhttpsの場合はベーシック認証の情報を埋め込む事が可能だったりします。
- 一般的な方法:
git clone https://github.com/miyabisun/dotfiles.git
- ベーシック認証:
git clone https://miyabisun:password@github.com/miyabisun/dotfiles.git
後者のようにすると、git pull
やgit 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 01:29
編集2018/02/28 01:31総合スコア21158
0
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 01:13
総合スコア1480
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
自己解決
みなさんの意見を参考に模索してみました。
懸念点などあれば教えてもらえると助かります。
試したこと
/var/www/html/.git が既にある場合です。
bash
1$ git init --separate-git-dir=/home/users/hoge 2Reinitialized existing Git repository in /home/users/hoge/
上記コマンドで、ワークスペースは /var/www/html/ のまま、
/home/users/hoge というリポジトリのディレクトリが作成されました。
元々あった /var/www/html/.gitはファイルに変更され、リポジトリの場所が記載されていました。
bash
1$ ls /home/users/hoge 2COMMIT_EDITMSG HEAD branches description index lfs objects refs 3FETCH_HEAD ORIG_HEAD config hooks info logs packed-refs 4 5$ cat /var/www/html/.git 6gitdir: /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 が既にある状態です。
bash
1$ git config core.sparsecheckout true 2 3# pull したいディレクトリ(/public)を書きます。 4$ vi .git/info/sparse-checkout 5 6$ cat .git/info/sparse-checkout 7/public 8 9# このコマンドを打つと、/public のみになります。 10$ git read-tree -m -u HEAD 11 12# リポジトリのディレクトリを非公開範囲に変更します。 13$ git init --separate-git-dir=/home/users/hoge 14Reinitialized existing Git repository in /home/users/hoge/
Git - git-read-tree Documentationより。
read-tree - ツリー情報をインデックスに読み込みます。
gitのread-treeが返ってくると、矛盾しているパスだけが結合解除状態になります。
-m
読み込みだけでなく、マージを実行します
-u
マージが成功したら、マージの結果をワークツリー内のファイルに更新します。
投稿2018/02/28 14:05
総合スコア15
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/28 13:24