Organisasi akses multi-pengguna ke server GIT

Saat menginstal dan mengkonfigurasi server Git, muncul pertanyaan tentang mengatur akses beberapa pengguna ke beberapa proyek. Saya meneliti masalahnya dan menemukan solusi yang memenuhi semua kebutuhan saya: sederhana, aman, dan andal.

Keinginan saya adalah:

  • setiap pengguna terhubung dengan akun mereka sendiri
  • Beberapa pengguna dapat mengerjakan satu proyek
  • pengguna yang sama dapat mengerjakan banyak proyek
  • setiap pengguna hanya memiliki akses ke proyek tempat dia bekerja
  • Seharusnya dapat terhubung melalui baris perintah, dan bukan hanya melalui semacam antarmuka web

Ini juga akan bagus:

  • memberikan izin baca-saja kepada orang yang mengendalikan
  • Kelola hak akses pengguna dengan mudah di Git

Ikhtisar opsi yang memungkinkan untuk mengakses server GIT

Pertama-tama, Anda perlu tahu apa yang harus dipilih, jadi inilah ikhtisar singkat tentang protokol Git.

  • ssh - akun pengguna yang dibuat khusus digunakan untuk mengakses server.
    • Anehnya, Git tidak mengecualikan penggunaan satu akun untuk mengakses semua repositori dari rekomendasinya. Ini sama sekali tidak memenuhi persyaratan saya.
    • Anda dapat menggunakan banyak akun, tetapi bagaimana Anda membatasi akses pengguna hanya pada direktori tertentu?
      • Menutup direktori home tidak cocok, karena sulit mengatur akses tulis di sana untuk pengguna lain
      • Menggunakan symlink dari direktori home Anda juga sulit karena Git tidak menafsirkannya sebagai link
      • Dimungkinkan untuk membatasi akses ke penerjemah, namun tidak ada jaminan penuh bahwa itu akan selalu berfungsi
        • Biasanya Anda dapat menghubungkan penerjemah perintah Anda sendiri untuk pengguna tersebut, namun
          • pertama, ini sudah merupakan keputusan yang sulit,
          • dan kedua, hal ini dapat dielakkan.

    Tapi mungkin bukan masalah jika pengguna dapat menjalankan perintah apa pun?.. Secara umum, metode ini tidak dapat dikesampingkan jika Anda mengetahui dengan tepat cara menggunakannya. Kita akan kembali ke cara ini nanti, tapi untuk saat ini kita akan mempertimbangkan secara singkat alternatif lain, mungkin akan ada yang lebih sederhana.

  • Protokol lokal git dapat digunakan dalam kombinasi dengan sshfs, banyak pengguna dapat digunakan, tetapi pada dasarnya sama seperti kasus sebelumnya
  • http - hanya baca
  • git hanya bisa dibaca
  • https - sulit untuk diinstal, Anda memerlukan perangkat lunak tambahan, semacam panel kontrol untuk mengatur akses pengguna... sepertinya bisa dilakukan, tapi entah kenapa semuanya rumit.

Menggunakan protokol ssh untuk mengatur akses multi-pengguna ke server Git

Mari kembali ke protokol ssh.

Karena Anda menggunakan akses ssh untuk git, Anda perlu memastikan keamanan data server. Pengguna yang terhubung melalui ssh menggunakan loginnya sendiri di server Linux, sehingga mereka dapat terhubung melalui klien ssh dan mengakses baris perintah server.
Tidak ada perlindungan lengkap terhadap akses tersebut.

Namun pengguna seharusnya tidak tertarik dengan file Linux. Informasi penting hanya disimpan di repositori git. Oleh karena itu, dimungkinkan untuk tidak membatasi akses melalui baris perintah, tetapi menggunakan alat Linux untuk melarang pengguna melihat proyek, tidak termasuk proyek yang ia ikuti.
Pilihan yang jelas adalah menggunakan sistem izin Linux.

Seperti yang telah disebutkan, hanya satu akun yang dapat digunakan untuk akses ssh. Konfigurasi ini tidak aman untuk beberapa pengguna, meskipun termasuk dalam daftar opsi git yang direkomendasikan.

Untuk menerapkan persyaratan yang diberikan di awal artikel, struktur direktori berikut dibuat dengan penugasan hak dan pemilik:

1) direktori proyek

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
dimana
dir1, dir2, dir3 - direktori proyek: proyek 1, proyek 2, proyek 3.

proj1:proj1, proj2:proj2, proj3:proj3 adalah pengguna Linux yang dibuat khusus yang ditugaskan sebagai pemilik direktori proyek terkait.

izin untuk semua direktori disetel ke 0770 - akses penuh untuk pemilik dan grupnya dan larangan total untuk semua orang.

2) akun pengembang

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

Poin kuncinya adalah pengembang diberi grup tambahan dari pengguna sistem pemilik proyek terkait. Hal ini dilakukan oleh administrator server Linux dengan satu perintah.

Dalam contoh ini, "Developer 1" sedang mengerjakan proyek proj1 dan proj2, dan "Developer 2" sedang mengerjakan proyek proj2 dan proj3.

Jika ada Pengembang yang terhubung melalui ssh melalui baris perintah, maka hak mereka tidak akan cukup bahkan untuk melihat isi direktori proyek di mana mereka tidak berpartisipasi. Dia sendiri tidak dapat mengubahnya.

Karena prinsip ini didasarkan pada keamanan dasar hak Linux, skema ini dapat diandalkan. Selain itu, skema ini sangat mudah dikelola.

Mari kita lanjutkan untuk berlatih.

Membuat repositori Git di server Linux

Kami memeriksa.

[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

aku capek mengetik dengan tangan..

[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 bahwa tidak mungkin mengakses repositori orang lain dari baris perintah dan bahkan melihat isinya.

[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

Berkolaborasi dengan banyak pengembang pada proyek yang sama di Git

Masih ada satu pertanyaan, jika satu pengembang memasukkan file baru, maka pengembang lain tidak dapat mengubahnya, karena dia sendiri adalah pemiliknya (misalnya, dev1), dan bukan pengguna pemilik proyek (misalnya, proj1). Karena kita memiliki repositori sisi server, pertama-tama, kita perlu mengetahui bagaimana struktur direktori “.git” dan apakah file baru dibuat.

Membuat repositori Git lokal dan mendorong ke server Git

Mari beralih ke 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>

Pada saat yang sama, file baru dibuat di server, dan itu milik pengguna yang melakukan 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]$

Saat Anda mengunggah perubahan ke server Git, file dan direktori tambahan dibuat, dan pemiliknya sebenarnya adalah pengguna yang mengunggah. Namun grup file dan direktori ini juga sesuai dengan grup utama pengguna ini, yaitu grup dev1 untuk pengguna dev1 dan grup dev2 untuk pengguna dev2 (mengubah grup utama pengguna pengembang tidak akan membantu, karena lalu bagaimana Anda bisa mengerjakan banyak proyek?). Dalam hal ini, pengguna dev2 tidak akan dapat mengubah file yang dibuat oleh pengguna dev1, yang dapat menyebabkan gangguan fungsionalitas.

Linux chown - mengubah pemilik file oleh pengguna biasa

Pemilik file tidak dapat mengubah kepemilikannya. Namun dia dapat mengubah grup file miliknya, dan kemudian file tersebut dapat dimodifikasi oleh pengguna lain yang berada dalam grup yang sama. Itu yang kami perlukan.

Menggunakan kait Git

Direktori kerja untuk hook adalah direktori root proyek. hook adalah executable yang berjalan di bawah pengguna yang melakukan push. Mengetahui hal ini, kami dapat mengimplementasikan rencana kami.

[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

atau hanya

vi hooks/post-update

Mari kembali ke 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

Di server Git, kami memeriksa pengoperasian skrip pasca-pembaruan hook setelah penerapan

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

- kosong, semuanya baik-baik saja.

Menghubungkan pengembang kedua di Git

Mari kita simulasikan pekerjaan pengembang kedua.

Pada 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

Dan pada saat yang sama, di server...

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

— kosong lagi, semuanya berfungsi.

Menghapus proyek Git dan mengunduh proyek dari server Git

Nah, Anda dapat sekali lagi memastikan bahwa semua perubahan telah disimpan.

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

— untuk menghapus proyek Git, cukup hapus direktori sepenuhnya. Mari kita hadapi kesalahan yang dihasilkan, karena tidak mungkin menghapus direktori saat ini menggunakan perintah ini, tetapi inilah perilaku yang kita perlukan.

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"

Berbagi akses di Git

Sekarang mari kita pastikan bahwa bahkan melalui Git pengembang kedua tidak dapat mengakses proyek Proj1, yang sedang tidak dia kerjakan.

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.

Sekarang kami mengizinkan akses

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

dan setelah itu semuanya berfungsi.

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

Untuk informasi lebih lanjut,

Selain itu, jika ada masalah dengan izin default saat membuat file dan direktori, di CentOS Anda dapat menggunakan perintah

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

Juga dalam artikel tersebut Anda mungkin menemukan hal-hal kecil yang bermanfaat:

  • cara membangun pohon direktori di Linux
  • cara meneruskan rentang alamat di sed dari baris tertentu ke akhir file, yaitu melakukan penggantian sed di semua baris kecuali baris pertama
  • Cara membalikkan kondisi pencarian di Linux temukan
  • Cara memasukkan beberapa baris ke dalam satu lingkaran menggunakan satu baris di shell Linux
  • Bagaimana cara menghindari tanda kutip tunggal di bash
  • cara menghapus direktori beserta seluruh isinya di baris perintah windows
  • Cara menggunakan bash mv untuk mengganti nama file tanpa menulis ulang lagi

Terima kasih atas perhatian Anda.

Sumber: www.habr.com

Tambah komentar