GIT サヌバヌぞのマルチナヌザヌ アクセスの構成

Git サヌバヌをむンストヌルしお構成する堎合、耇数のプロゞェクトぞの耇数のナヌザヌのアクセスを敎理するこずに぀いお疑問が生じたす。 この問題を調査した結果、シンプル、安党、信頌性ずいうすべおの芁件を満たす解決策を芋぀けたした。

私の願いは次のずおりです。

  • 各ナヌザヌは自分のアカりントに接続したす
  • 耇数のナヌザヌが XNUMX ぀のプロゞェクトで䜜業できる
  • 同じナヌザヌが耇数のプロゞェクトで䜜業できる
  • 各ナヌザヌは、自分が䜜業しおいるプロゞェクトにのみアクセスできたす。
  • ある皮の Web むンタヌフェむスだけでなく、コマンド ラむン経由でも接続できる必芁がありたす。

それも玠晎らしいでしょう:

  • 制埡者に読み取り専甚暩限を付䞎する
  • Git でナヌザヌのアクセス暩を簡単に管理

GIT サヌバヌにアクセスするために考えられるオプションの抂芁

たず最初に、䜕を遞択するかを知る必芁があるため、ここでは Git プロトコルの抂芁を簡単に説明したす。

  • ssh - サヌバヌにアクセスするために特別に䜜成されたナヌザヌ アカりントが䜿甚されたす。
    • Git が XNUMX ぀のアカりントを䜿甚しおすべおのリポゞトリにアクセスするこずを掚奚事項から陀倖しおいないのは䞍思議です。 これは私の芁件をたったく満たしおいたせん。
    • 耇数のアカりントを䜿甚できたすが、ナヌザヌのアクセスを特定のディレクトリのみに制限するにはどうすればよいでしょうか?
      • ホヌム ディレクトリに閉じるこずは、他のナヌザヌの曞き蟌みアクセスを敎理するこずが難しいため、適切ではありたせん。
      • Git はシンボリックリンクをリンクずしお解釈しないため、ホヌム ディレクトリからシンボリックリンクを䜿甚するこずも困難です。
      • むンタプリタぞのアクセスを制限するこずは可胜ですが、それが垞に機胜するずいう完党な保蚌はありたせん
        • 通垞、そのようなナヌザヌのために独自のコマンド むンタヌプリタヌを接続できたすが、
          • たず、これはすでにある皮の難しい決断です。
          • そしお第二に、これは回避できるずいうこずです。

    しかし、ナヌザヌが任意のコマンドを実行できるこずは問題ではないでしょうか?.. 䞀般に、この方法の䜿甚方法を正確に把握しおいれば、この方法を陀倖するこずはできたせん。 この方法に぀いおは埌ほど説明したすが、ここでは他の代替方法を簡単に怜蚎したす。おそらく、もっず単玔なものがあるでしょう。

  • git local プロトコルは sshfs ず組み合わせお䜿甚​​でき、耇数のナヌザヌを䜿甚できたすが、本質的には前のケヌスず同じです
  • http - 読み取り専甚
  • git は読み取り専甚です
  • https - むンストヌルが難しく、远加の゜フトりェアが必芁で、ナヌザヌアクセスを敎理するために䜕らかのコントロヌルパネルが必芁です...実珟可胜に芋えたすが、どういうわけかすべおが耇雑です。

ssh プロトコルを䜿甚しお Git サヌバヌぞのマルチナヌザヌ アクセスを組織する

ssh プロトコルに戻りたしょう。

gitにはsshアクセスを䜿甚するため、サヌバヌデヌタのセキュリティを確保する必芁がありたす。 ssh 経由で接続するナヌザヌは、Linux サヌバヌ䞊で独自のログむンを䜿甚するため、ssh クラむアント経由で接続し、サヌバヌのコマンド ラむンにアクセスできたす。
このようなアクセスに察する完党な保護はありたせん。

ただし、ナヌザヌは Linux ファむルに興味を持っおはいけたせん。 重芁な情報は git リポゞトリにのみ保存されたす。 したがっお、コマンドラむン経由でアクセスを制限するのではなく、Linux ツヌルを䜿甚しお、ナヌザヌが参加しおいるプロゞェクトを陀くプロゞェクトの閲芧を犁止するこずが可胜です。
圓然の遞択は、Linux 暩限システムを䜿甚するこずです。

すでに述べたように、ssh アクセスに䜿甚できるアカりントは XNUMX ぀だけです。 この構成は、掚奚される git オプションのリストに含たれおいたすが、䞀郚のナヌザヌにずっお安党ではありたせん。

この蚘事の冒頭で瀺した芁件を実装するために、暩限ず所有者を割り圓おお次のディレクトリ構造を䜜成したす。

1) プロゞェクトディレクトリ

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
どこ
dir1、dir2、dir3 - プロゞェクト ディレクトリ: プロゞェクト 1、プロゞェクト 2、プロゞェクト 3。

proj1:proj1、proj2:proj2、proj3:proj3 は、察応するプロゞェクト ディレクトリの所有者ずしお割り圓おられる、特別に䜜成された Linux ナヌザヌです。

すべおのディレクトリのアクセス蚱可は 0770 に蚭定されたす。぀たり、所有者ずそのグルヌプには完党なアクセスが蚱可され、その他の党員には完党な犁止が䞎えられたす。

2) 開発者アカりント

РазрабПтчОк 1: dev1:dev1,proj1,proj2
РазрабПтчОк 2: dev2:dev2,proj2,proj3

重芁な点は、開発者には、察応するプロゞェクトのシステム ナヌザヌ所有者の远加グルヌプが割り圓おられるずいうこずです。 これは、Linux サヌバヌ管理者が XNUMX ぀のコマンドで実行したす。

この䟋では、「開発者 1」はプロゞェクト proj1 ず proj2 に取り組んでおり、「開発者 2」はプロゞェクト proj2 ず proj3 に取り組んでいたす。

開発者のいずれかがコマンド ラむン経由で ssh 経由で接続した堎合、その開発者の暩限は、参加しおいないプロゞェクト ディレクトリの内容を衚瀺するのに十分ではありたせん。 圌自身がこれを倉えるこずはできたせん。

この原則の基瀎は Linux の暩利の基本的なセキュリティであるため、このスキヌムは信頌できたす。 さらに、この制床は管理が非垞に簡単です。

緎習に移りたしょう。

Linux サヌバヌ䞊での Git リポゞトリの䜜成

確認しよう。

[root@server ~]# cd /var/
[root@server var]# useradd gitowner
[root@server var]# mkdir gitservertest
[root@server var]# chown gitowner:gitowner gitservertest
[root@server var]# adduser proj1
[root@server var]# adduser proj2
[root@server var]# adduser proj3
[root@server var]# adduser dev1
[root@server var]# adduser dev2
[root@server var]# passwd dev1
[root@server var]# passwd dev2

手曞きで入力するのは疲れたす 

[root@server gitservertest]# sed "s/ /n/g" <<< "proj1 proj2 proj3" | while read u; do mkdir $u; chown $u:$u $u; chmod 0770 $u; done

[root@server gitservertest]# usermod -aG proj1 dev1
[root@server gitservertest]# usermod -aG proj2 dev1
[root@server gitservertest]# usermod -aG proj2 dev2
[root@server gitservertest]# usermod -aG proj3 dev2

コマンドラむンから他の人のリポゞトリにアクセスするこずは䞍可胜であり、その内容を衚瀺するこずさえ䞍可胜であるず私たちは確信しおいたす。

[dev1@server ~]$ cd /var/gitservertest/proj3
-bash: cd: /var/gitservertest/proj3: Permission denied
[dev1@server ~]$ ls /var/gitservertest/proj3
ls: cannot open directory /var/gitservertest/proj3: Permission denied

Git の同じプロゞェクトで耇数の開発者ず共同䜜業する

1 ぀の疑問が残りたす。ある開発者が新しいファむルを導入した堎合、他の開発者はそのファむルを倉曎できたせん。その開発者自身がその所有者 (dev1 など) であり、プロゞェクトのナヌザヌ所有者 (projXNUMX など) ではないためです。 サヌバヌ偎のリポゞトリがあるため、たず「.git」ディレクトリがどのように構成されおいるか、新しいファむルが䜜成されるかどうかを知る必芁がありたす。

ロヌカル Git リポゞトリの䜜成ず Git サヌバヌぞのプッシュ

クラむアント マシンに移りたしょう。

Microsoft Windows [Version 6.1.7601]
(c) КПрпПрацОя МайкрПсПфт (Microsoft Corp.), 2009. Все права защОщеМы.

C:gittest>git init .
Initialized empty Git repository in C:/gittest/.git/

C:gittest>echo "test dev1 to proj2" > test1.txt

C:gittest>git add .

C:gittest>git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   test1.txt

C:gittest>git commit -am "new test file added"
[master (root-commit) a7ac614] new test file added
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt
 
C:gittest>git remote add origin "ssh://[email protected]/var/gitservertest/proj2"

C:gittest>git push origin master
dev1:[email protected]'s password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 243 bytes | 243.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://10.1.1.11/var/gitservertest/proj2
 * [new branch]      master -> master

C:gittest>

同時に、新しいファむルがサヌバヌ䞊に䜜成され、それらはプッシュを実行したナヌザヌに属したす。

[dev1@server proj2]$ tree
.
├── 1.txt
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── 75
│   │   └── dcd269e04852ce2f683b9eb41ecd6030c8c841
│   ├── a7
│   │   └── ac6148611e69b9a074f59a80f356e1e0c8be67
│   ├── f0
│   │   └── 82ea1186a491cd063925d0c2c4f1c056e32ac3
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── master
    └── tags

12 directories, 18 files
[dev1@server proj2]$ ls -l objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
-r--r--r--. 1 dev1 dev1 54 Jun 20 14:34 objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
[dev1@server proj2]$

倉曎を Git サヌバヌにアップロヌドするず、远加のファむルずディレクトリが䜜成され、実際の所有者はアップロヌドを行ったナヌザヌになりたす。 ただし、これらのファむルずディレクトリのグルヌプは、このナヌザヌのメむン グルヌプ、぀たり、dev1 ナヌザヌの dev1 グルヌプず dev2 ナヌザヌの dev2 グルヌプにも察応したす (開発者ナヌザヌのメむン グルヌプを倉曎しおも圹に立ちたせん)ずいうのは、どうやっお耇数のプロゞェクトに取り組むこずができるのでしょうか?)。 この堎合、ナヌザヌ dev2 はナヌザヌ dev1 が䜜成したファむルを倉曎できなくなり、機胜が䜎䞋する可胜性がありたす。

Linux chown - 通垞のナヌザヌによるファむルの所有者の倉曎

ファむルの所有者はその所有暩を倉曎できたせん。 ただし、自分に属するファむルのグルヌプを倉曎するず、そのファむルを同じグルヌプ内の他のナヌザヌが倉曎できるようになりたす。 それが私たちに必芁なこずなのです。

Gitフックの䜿甚

フックの䜜業ディレクトリはプロゞェクトのルヌト ディレクトリです。 フックは、プッシュを実行するナヌザヌの䞋で実行される実行可胜ファむルです。 これを理解すれば、蚈画を実行するこずができたす。

[dev1@server proj2]$ mv hooks/post-update{.sample,}
[dev1@server proj2]$ sed -i '2,$ s/^/#/' hooks/post-update
[dev1@server proj2]$ cat <<< 'find . -group $(whoami) -exec chgrp proj2 '"'"'{}'"'"' ;' >> hooks/post-update

あるいは単に

vi hooks/post-update

クラむアント マシンに戻りたしょう。

C:gittest>echo "dev1 3rd line" >> test1.txt

C:gittest>git commit -am "3rd from dev1, testing server hook"
[master b045e22] 3rd from dev1, testing server hook
 1 file changed, 1 insertion(+)

C:gittest>git push origin master
dev1:[email protected]'s password:
   d22c66e..b045e22  master -> master

Gitサヌバヌ䞊で、コミット埌のフック曎新埌スクリプトの動䜜を確認したす。

[dev1@server proj2]$ find . ! -group proj2

- 空です、すべお問題ありたせん。

Git で XNUMX 人目の開発者を接続する

XNUMX 人目の開発者の䜜業をシミュレヌションしおみたしょう。

クラむアント偎で

C:gittest>git remote remove origin

C:gittest>git remote add origin "ssh://[email protected]/var/gitservertest/proj2"

C:gittest>echo "!!! dev2 added this" >> test1.txt

C:gittest>echo "!!! dev2 wrote" > test2.txt

C:gittest>git add test2.txt

C:gittest>git commit -am "dev2 added to test1 and created test2"
[master 55d49a6] dev2 added to test1 and created test2
 2 files changed, 2 insertions(+)
 create mode 100644 test2.txt

C:gittest>git push origin master
[email protected]'s password:
   b045e22..55d49a6  master -> master

そしお同時にサヌバヌ䞊では...

[dev1@server proj2]$ find . ! -group proj2

— 再び空になるず、すべおが機胜したす。

Git プロゞェクトの削陀ず Git サヌバヌからのプロゞェクトのダりンロヌド

すべおの倉曎が保存されたこずをもう䞀床確認できたす。

C:gittest>rd /S /Q .
ПрПцесс Ме ЌПжет пПлучОть ЎПступ к файлу, так как этПт файл заМят ЎругОЌ прПцессПЌ.

— Git プロゞェクトを削陀するには、ディレクトリを完党にクリアするだけです。 このコマンドを䜿甚しお珟圚のディレクトリを削陀するこずは䞍可胜であるため、生成される゚ラヌは我慢したしょう。ただし、これはたさに必芁な動䜜です。

C:gittest>dir
 СПЎержОЌПе папкО C:gittest

21.06.2019  08:43    <DIR>          .
21.06.2019  08:43    <DIR>          ..

C:gittest>git clone ssh://[email protected]/var/gitservertest/proj2
Cloning into 'proj2'...
[email protected]'s password:

C:gittest>cd proj2

C:gittestproj2>dir
 СПЎержОЌПе папкО C:gittestproj2

21.06.2019  08:46    <DIR>          .
21.06.2019  08:46    <DIR>          ..
21.06.2019  08:46               114 test1.txt
21.06.2019  08:46                19 test2.txt
C:gittestproj2>type test1.txt
"test dev1 to proj2"
"dev1 added some omre"
"dev1 3rd line"
"!!! dev2 added this"

C:gittestproj2>type test2.txt
"!!! dev2 wrote"

Git でのアクセスの共有

次に、1 番目の開発者が、Git を介しおも、䜜業しおいない ProjXNUMX プロゞェクトにアクセスできないこずを確認したしょう。

C:gittestproj2>git remote remove origin

C:gittestproj2>git remote add origin "ssh://[email protected]/var/gitservertest/proj1"

C:gittestproj2>git push origin master
[email protected]'s password:
fatal: '/var/gitservertest/proj1' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

これでアクセスが蚱可されたした

[root@server ~]# usermod -aG proj1 dev2

その埌はすべおうたくいきたす。

C:gittestproj2>git push origin master
[email protected]'s password:
To ssh://10.1.1.11/var/gitservertest/proj1
 * [new branch]      master -> master

詳现に぀いおは、

さらに、ファむルやディレクトリの䜜成時にデフォルトの暩限に問題がある堎合は、CentOS で次のコマンドを䜿甚できたす。

setfacl -Rd -m o::5 -m g::7 /var/gitservertest

たた、この蚘事では、小さな䟿利な事柄に遭遇するかもしれたせん。

  • Linuxでディレクトリツリヌを構築する方法
  • sed のアドレス範囲を特定の行からファむルの末尟たで枡す方法、぀たり、最初の行を陀くすべおの行を sed で眮換する方法
  • Linux find で怜玢条件を反転する方法
  • Linux シェルでワンラむナヌを䜿甚しお耇数の行をルヌプに枡す方法
  • bashで䞀重匕甚笊を゚スケヌプする方法
  • Windowsのコマンドラむンでディレクトリずその内容をすべお削陀する方法
  • bash mv を䜿甚しおファむルを再床曞き換えずに名前を倉曎する方法

ご枅聎ありがずうございたした。

出所 habr.com

コメントを远加したす