Organisasi aksés multi-pamaké ka server GIT

Nalika masang sareng ngonpigurasikeun server Git, timbul patarosan ngeunaan ngatur aksés pikeun sababaraha pangguna kana sababaraha proyék. Kuring nalungtik masalah sareng mendakan solusi anu nyumponan sadaya syarat kuring: sederhana, aman, dipercaya.

Kahayang kuring nyaéta:

  • unggal pamaké nyambung jeung akun sorangan
  • Sababaraha pamaké tiasa dianggo dina hiji proyék
  • pamaké sarua bisa dianggo dina sababaraha proyék
  • unggal pangguna ngan ukur gaduh aksés kana proyék-proyék anu anjeunna damel
  • Sakuduna mungkin pikeun nyambungkeun via garis paréntah, teu ngan ngaliwatan sababaraha jenis panganteur web

Éta ogé bakal saé:

  • masihan idin baca wungkul ka jalma anu ngatur
  • Ngatur hak aksés pangguna dina Git

Tinjauan pilihan kamungkinan pikeun ngakses server GIT

Anu mimiti, anjeun kedah terang naon anu kedah dipilih, janten ieu mangrupikeun gambaran gancang ngeunaan protokol Git.

  • ssh - rekening pamaké dijieun husus dipaké pikeun ngakses server.
    • Éta anéh yén Git henteu ngaluarkeun tina rekomendasina ngagunakeun hiji akun pikeun ngaksés sadaya repositori. Ieu teu minuhan sarat kuring pisan.
    • Anjeun tiasa nganggo sababaraha akun, tapi kumaha anjeun tiasa ngabatesan aksés pangguna ngan ukur diréktori anu tangtu?
      • Nutup kana diréktori imah teu cocog, sabab hese ngatur aksés nulis aya pikeun pamaké séjén
      • Ngagunakeun symlinks tina diréktori asal anjeun ogé hésé sabab Git henteu napsirkeun aranjeunna salaku tumbu
      • Kasebut nyaéta dimungkinkeun pikeun ngawatesan aksés ka juru, tapi euweuh jaminan pinuh yén éta bakal salawasna jalan
        • Anjeun umumna bisa nyambungkeun juru paréntah sorangan pikeun pamaké sapertos, tapi
          • kahiji, ieu geus sababaraha jenis kaputusan hésé,
          • jeung Bréh, ieu bisa circumvented.

    Tapi meureun teu masalah nu pamaké bakal tiasa ngaéksekusi sagala paréntah? Urang bakal uih deui ka padika ieu engké, tapi pikeun ayeuna urang bakal mertimbangkeun sakeudeung alternatif séjén, meureun bakal aya hal basajan.

  • Protokol lokal git tiasa dianggo dina kombinasi sareng sshfs, sababaraha pangguna tiasa dianggo, tapi dasarna sami sareng kasus saméméhna.
  • http - baca wungkul
  • git ngan ukur dibaca
  • HTTPS - sesah dipasang, anjeun peryogi parangkat lunak tambahan, sababaraha jinis panel kontrol pikeun ngatur aksés pangguna ... sigana tiasa waé, tapi kumaha waé sadayana pajeulit.

Ngagunakeun protokol ssh pikeun ngatur aksés multi-pamaké ka server Git

Hayu urang balik deui ka protokol ssh.

Kusabab anjeun nganggo aksés ssh pikeun git, anjeun kedah mastikeun kaamanan data server. Pamaké anu nyambung via ssh ngagunakeun login sorangan dina server Linux, ngarah bisa nyambung via ssh klien tur ngakses garis paréntah server urang.
Henteu aya panyalindungan lengkep ngalawan aksés sapertos kitu.

Tapi pangguna henteu kedah resep kana file Linux. Inpormasi anu penting disimpen ukur dina gudang git. Ku alatan éta, kasebut nyaéta dimungkinkeun pikeun teu ngawatesan aksés ngaliwatan garis paréntah, tapi ngagunakeun parabot Linux Ubuntu pikeun nyaram pamaké ti nempo proyék, kaasup nu manehna milu.
Pilihan anu jelas nyaéta ngagunakeun sistem idin Linux.

Sakumaha anu geus disebutkeun, kasebut nyaéta dimungkinkeun pikeun ngagunakeun ngan hiji akun pikeun aksés ssh. Konfigurasi ieu henteu aman pikeun sababaraha pangguna, sanaos kalebet dina daptar pilihan git anu disarankeun.

Pikeun ngalaksanakeun sarat anu dipasihkeun dina awal tulisan, struktur diréktori ieu didamel kalayan ngerjakeun hak sareng pamilik:

1) diréktori proyék

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
di mana
dir1, dir2, dir3 - diréktori proyék: proyék 1, proyék 2, proyék 3.

proj1: proj1, proj2: proj2, proj3: proj3 dijieun husus pamaké Linux Ubuntu nu ditugaskeun salaku nu boga directories proyék pakait.

idin pikeun sakabéh directories disetel ka 0770 - aksés pinuh pikeun nu boga jeung grup na sarta larangan lengkep pikeun dulur sejenna.

2) rekening pamekar

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

Titik konci éta pamekar anu ditugaskeun grup tambahan tina pamaké sistem nu boga proyék pakait. Hal ieu dilakukeun ku administrator server Linux kalayan hiji paréntah.

Dina conto ieu, "Pamekar 1" ngerjakeun proyék proj1 sareng proj2, sareng "Pamekar 2" damel dina proyék proj2 sareng proj3.

Lamun salah sahiji Pamekar nyambung via ssh via garis paréntah, hak maranéhanana moal cukup malah pikeun nempo eusi directories proyék nu maranéhna teu ilubiung. Anjeunna teu tiasa ngarobih ieu nyalira.

Kusabab dasar prinsip ieu mangrupikeun kaamanan dasar hak Linux, skéma ieu tiasa dipercaya. Sajaba ti éta, skéma ieu pisan gampang administer.

Hayu urang teraskeun latihan.

Nyiptakeun repositori Git dina server Linux

Hayu urang pariksa.

[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

Bosen ngetik ku leungeun...

[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

Kami yakin yén mustahil pikeun ngaksés repositori jalma sanés tina garis paréntah sareng ningali eusina.

[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

Kolaborasi sareng sababaraha pamekar dina proyék anu sami di Git

Hiji patarosan tetep, upami hiji pamekar ngenalkeun file anyar, pamekar séjén teu bisa ngarobah éta, sabab anjeunna sorangan nu boga na (contona, dev1), sarta lain nu boga pamaké proyék (contona, proj1). Kusabab urang gaduh gudang sisi server, mimitina, urang kedah terang kumaha diréktori ".git" terstruktur sareng naha file énggal didamel.

Nyiptakeun gudang Git lokal sareng ngadorong ka server Git

Hayu urang ngaléngkah ka mesin klien.

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>

Dina waktos anu sami, file énggal didamel dina server, sareng aranjeunna milik pangguna anu ngalaksanakeun push

[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]$

Lamun anjeun unggah parobahan server Git, file tambahan sarta directories dijieun, sarta boga maranéhanana sabenerna pamaké nu nyieun unggah. Tapi teras grup file sareng diréktori ieu ogé pakait sareng grup utama pangguna ieu, nyaéta, grup dev1 pikeun pangguna dev1 sareng grup dev2 pikeun pangguna dev2 (ngarobah grup utama pangguna pamekar moal ngabantosan, sabab lajeng kumaha anjeun tiasa dianggo dina sababaraha proyék?). Dina hal ieu, pamaké dev2 moal bisa ngarobah payil nu dijieun ku pamaké dev1, nu bisa ngakibatkeun ngarecahna pungsionalitasna.

Linux chown - ngarobah nu boga file ku pamaké biasa

Nu boga file teu bisa ngarobah milikna. Tapi anjeunna tiasa ngarobih grup file anu kagungan anjeunna, teras file ieu tiasa dirobih ku pangguna sanés anu aya dina grup anu sami. Éta naon urang peryogi.

Ngagunakeun Git hook

Diréktori kerja pikeun hook nyaéta diréktori akar proyek. hook mangrupa laksana anu ngajalankeun handapeun pamaké ngalakukeun push. Nyaho ieu, urang tiasa ngalaksanakeun rencana urang.

[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

atawa ngan

vi hooks/post-update

Hayu urang balik deui ka mesin klien.

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

Dina server Git, urang pariksa operasi skrip post-update hook saatos komitmen

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

- kosong, sagalana geus rupa.

Nyambungkeun pamekar kadua di Git

Hayu urang simulate karya pamekar kadua.

Dina klien

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

Sareng dina waktos anu sami, dina server ...

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

- kosong deui, sagalana jalan.

Ngahapus proyék Git sareng unduh proyék tina server Git

Nya, anjeun tiasa sakali deui mastikeun yén sadaya parobihan parantos disimpen.

C:gittest>rd /S /Q .
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

- pikeun ngahapus proyék Git, kantun hapus diréktori sacara lengkep. Hayu urang nempatkeun up jeung kasalahan anu dihasilkeun, saprak teu mungkin pikeun ngahapus diréktori ayeuna maké paréntah ieu, tapi ieu persis kabiasaan urang kudu.

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"

Ngabagikeun aksés dina Git

Ayeuna hayu urang pastikeun yén sanajan ngaliwatan Git pamekar kadua teu bisa ngakses proyék Proj1, dimana anjeunna teu jalan.

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.

Ayeuna urang ngidinan aksés

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

sarta sanggeus éta sagalana jalan.

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

Kanggo inpo nu leuwih lengkep,

Salaku tambahan, upami aya masalah sareng idin standar nalika nyiptakeun file sareng diréktori, dina CentOS anjeun tiasa nganggo paréntah

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

Ogé dina tulisan anjeun tiasa titajong kana hal-hal anu mangpaat:

  • kumaha carana ngawangun tangkal diréktori dina Linux
  • kumaha carana ngirim sauntuyan alamat di sed ti garis nu tangtu ka tungtung file, nyaeta, nyieun ngagantian di sed dina sakabéh garis iwal baris kahiji
  • Kumaha cara ngabalikeun kaayaan panéangan dina panggihan Linux
  • Kumaha cara ngalirkeun sababaraha garis kana loop nganggo hiji-liner dina cangkang Linux
  • Kumaha kabur tanda petik tunggal dina bash
  • kumaha mupus diréktori sareng sadaya eusina dina baris paréntah windows
  • Kumaha ngagunakeun bash mv pikeun ngaganti ngaran file tanpa nyerat deui

Hatur nuhun pikeun perhatian Anjeun.

sumber: www.habr.com

Tambahkeun komentar