SSH経由でリモートからアクセスするgitリポジトリがいくつかあり、それらの一部を読み取り専用にして、プッシュが増えないようにします。一部の人々は、これらのリポジトリを指すリモートを持っています。
これらのベアリポジトリは初期化されました--shared=group
では、すべてのファイルのファイル許可を660に設定しても、SSHアクセスは許可されますが、書き込みは許可されませんか?それとも簡単な方法はありますか?
乾杯。
これを行うには、複数の方法があります。
ユーザーがそれぞれシェルアカウント(おそらく制限されている)を持ち、それぞれが自分のアカウント経由でgitリポジトリにアクセスする場合、filesystem permissionsを使用してgitリポジトリへのSSHアクセスを制御できます。 Unixでは、ディレクトリに対する書き込みアクセス許可になります。おそらく、グループの作成とグループの特定のアクセス許可(「スティッキグループID」セット)が役立ちます。
プッシュするにはgit-receive-pack
がユーザーの$ PATHに存在し、それらに対して実行可能であることが必要です...
update
またはpre-receive
hookを使用して、リポジトリへのアクセス制御を行うことができます。たとえば、gitソースのcontrib/hooks
からの update-paranoid フックの例を使用します。
より多くのユーザーがいる場合は、gitリポジトリへのアクセスを管理するツールを使用すると、より良い可能性があります Gitosis (Pythonではsetuptoolsが必要)または Gitolite (Perlで)。
読み取り専用アクセスの場合、git daemonを設定して、SSHプロトコル経由のアクセスの代わりにgit://
プロトコル経由で読み取り専用の匿名(および認証されていない)アクセスを提供できます。
SSHからGITプロトコルへの移行を容易にする方法については、url.<base>.insteadOf
構成変数のドキュメントを参照してください。
Scott Chaconによる Pro Git 本(CC-BY-NC-SAライセンス)の第4章「 Git on the Server 」も参照してください。
pre-receive
フックは単に情報メッセージを出力し、ゼロ以外のステータスで終了するジョブを実行します。
メッセージに意味のある情報を入れると、欲求不満のユーザーがプッシュできない理由を尋ねるクエリも削減されます。
#!/bin/bash
echo "=================================================="
echo "This repository is no longer available for pushes."
echo "Please visit blah blah yadda yadda ...."
echo "=================================================="
exit 1
スクリプトの実行権限を設定し、正しいユーザーおよび/またはグループが所有していることを確認してください。そうしないと、実行されず、警告も表示されません。
chmod -R a-w /path/to/repo.git
Gitは主にアクセス制御のためにファイルシステムに依存しているため、動作します。あなたの許可では、ワールドはファイルにアクセスできませんが、ユーザーとグループには読み取り/書き込みアクセスがあります。誰でも読めるようにするには、許可を0444
にする必要があります。
ユーザーがnobody
で、グループがgitdevs
のような0664
としてリポジトリ権限を設定することにより、さらにきめ細かな制御を行うことができます。そうすると、gitdevs
グループの人々だけがレポに書き込むことができますが、世界はそこから読むことができます。
フォローアップここにリンクがあります レポを共有するさまざまな方法をカバーし、プロの長所と短所、アクセス制御機能をカバーします。
このコメント に触発された:
hooks/pre-receive
ファイルを次のコンテンツで更新します。
#!/bin/sh
echo "Closed for all pushes" ; exit 1
このように、このレポジトリへの変更をプッシュしようとするすべてのユーザーは上記のメッセージを受け取り、プッシュは拒否されます。
私はGitLabの単なるユーザーであるため(最初のステップで管理者を煩わせたくありませんでした)、別の方法で検索して見つけました。
アクセス制御も必要な場合は、 gitosis を確認してください。設定は非常に簡単で、簡単なスクリプトを使用して誰が何を実行できるかを制御できます。
もう1つの可能性はgitプロトコルですが、gitデーモンが実行されている必要があります。
最近、「/ repo.git/git-receive-pack」パスへのアクセスを制限して、リポジトリが一部のユーザーに対して読み取り/書き込みであり、一部のユーザーに対して読み取り専用であるという結果を達成しました。 httpd configでは、次のようになります。
<Location /repo.git/>
Require group developers developers-ro
</Location>
<Location /repo.git/git-receive-pack>
Require group developers
</Location>