Tổ chức nhiều người dùng truy cập vào máy chủ GIT

Khi cài đặt và định cấu hình máy chủ Git, câu hỏi đặt ra là tổ chức quyền truy cập cho một số người dùng vào một số dự án. Tôi đã nghiên cứu vấn đề và tìm ra giải pháp đáp ứng mọi yêu cầu của tôi: đơn giản, an toàn, đáng tin cậy.

Mong muốn của tôi là:

  • mỗi người dùng kết nối với tài khoản của riêng họ
  • Một số người dùng có thể làm việc trên một dự án
  • cùng một người dùng có thể làm việc trên nhiều dự án
  • mỗi người dùng chỉ có quyền truy cập vào những dự án mà anh ta làm việc
  • Có thể kết nối thông qua dòng lệnh chứ không chỉ thông qua một số loại giao diện web

Nó cũng sẽ rất tuyệt:

  • cấp quyền chỉ đọc cho người kiểm soát
  • Quản lý thuận tiện quyền truy cập của người dùng trong Git

Tổng quan về các tùy chọn có thể có để truy cập máy chủ GIT

Trước hết, bạn cần biết nên chọn cái gì, vì vậy đây là tổng quan nhanh về các giao thức Git.

  • ssh - tài khoản người dùng được tạo đặc biệt được sử dụng để truy cập máy chủ.
    • Thật kỳ lạ khi Git không loại trừ khỏi các khuyến nghị của mình việc sử dụng một tài khoản để truy cập tất cả các kho lưu trữ. Điều này không đáp ứng được yêu cầu của tôi chút nào.
    • Bạn có thể sử dụng nhiều tài khoản, nhưng làm cách nào bạn có thể giới hạn quyền truy cập của người dùng vào một số thư mục nhất định?
      • Việc đóng vào thư mục chính là không phù hợp vì khó tổ chức quyền truy cập ghi vào đó cho những người dùng khác
      • Việc sử dụng các liên kết tượng trưng từ thư mục chính của bạn cũng khó khăn vì Git không hiểu chúng là liên kết
      • Có thể hạn chế quyền truy cập vào trình thông dịch, nhưng không có gì đảm bảo đầy đủ rằng nó sẽ luôn hoạt động
        • Nói chung, bạn có thể kết nối trình thông dịch lệnh của riêng mình cho những người dùng như vậy, nhưng
          • Đầu tiên, đây đã là một quyết định khó khăn rồi,
          • và thứ hai, điều này có thể bị phá vỡ.

    Nhưng có lẽ việc người dùng có thể thực hiện bất kỳ lệnh nào không phải là vấn đề?.. Nói chung, không thể loại trừ phương pháp này nếu bạn tìm ra chính xác cách sử dụng nó. Chúng ta sẽ quay lại phương pháp này sau, nhưng bây giờ chúng ta sẽ xem xét ngắn gọn các lựa chọn thay thế khác, có thể sẽ có cách nào đó đơn giản hơn.

  • Giao thức git local có thể được sử dụng kết hợp với sshfs, có thể sử dụng nhiều người dùng, nhưng về cơ bản vẫn giống như trường hợp trước
  • http - chỉ đọc
  • git chỉ đọc
  • https - khó cài đặt, bạn cần phần mềm bổ sung, một số loại bảng điều khiển để tổ chức quyền truy cập của người dùng... trông có vẻ khả thi, nhưng không hiểu sao mọi thứ lại phức tạp.

Sử dụng giao thức ssh để tổ chức quyền truy cập nhiều người dùng vào máy chủ Git

Hãy quay lại giao thức ssh.

Vì bạn sử dụng quyền truy cập ssh cho git nên bạn cần đảm bảo tính bảo mật của dữ liệu máy chủ. Người dùng kết nối qua ssh sử dụng thông tin đăng nhập của riêng họ trên máy chủ Linux, do đó họ có thể kết nối qua máy khách ssh và truy cập dòng lệnh của máy chủ.
Không có sự bảo vệ hoàn toàn chống lại sự truy cập như vậy.

Nhưng người dùng không nên quan tâm đến các tập tin Linux. Thông tin quan trọng chỉ được lưu trữ trong kho git. Do đó, có thể không hạn chế quyền truy cập thông qua dòng lệnh mà sử dụng các công cụ Linux để cấm người dùng xem các dự án, ngoại trừ những dự án mà anh ta tham gia.
Sự lựa chọn rõ ràng là sử dụng hệ thống cấp phép Linux.

Như đã đề cập, chỉ có thể sử dụng một tài khoản để truy cập ssh. Cấu hình này không an toàn đối với một số người dùng, mặc dù nó được đưa vào danh sách các tùy chọn git được đề xuất.

Để thực hiện các yêu cầu được đưa ra ở đầu bài viết, cấu trúc thư mục sau được tạo với sự phân công quyền và chủ sở hữu:

1) thư mục dự án

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
đâu
dir1, dir2, dir3 - thư mục dự án: dự án 1, dự án 2, dự án 3.

proj1:proj1, proj2:proj2, proj3:proj3 là những người dùng Linux được tạo đặc biệt và được chỉ định làm chủ sở hữu của các thư mục dự án tương ứng.

quyền cho tất cả các thư mục được đặt thành 0770 - toàn quyền truy cập cho chủ sở hữu và nhóm của anh ta và cấm hoàn toàn đối với những người khác.

2) tài khoản nhà phát triển

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

Điểm mấu chốt là các nhà phát triển được chỉ định thêm một nhóm chủ sở hữu hệ thống của dự án tương ứng. Việc này được quản trị viên máy chủ Linux thực hiện bằng một lệnh.

Trong ví dụ này, "Nhà phát triển 1" đang làm việc trên các dự án proj1 và proj2, còn "Nhà phát triển 2" đang làm việc trên các dự án proj2 và proj3.

Nếu bất kỳ Nhà phát triển nào kết nối qua ssh thông qua dòng lệnh, thì quyền của họ sẽ không đủ ngay cả để xem nội dung của các thư mục dự án mà họ không tham gia. Anh ấy không thể tự mình thay đổi điều này.

Vì cơ sở của nguyên tắc này là tính bảo mật cơ bản của các quyền Linux nên sơ đồ này đáng tin cậy. Ngoài ra, chương trình này rất dễ quản lý.

Hãy chuyển sang thực hành.

Tạo kho Git trên máy chủ Linux

Chung ta kiểm tra.

[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

Tôi chán việc gõ nó bằng tay rồi...

[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

Chúng tôi tin chắc rằng không thể truy cập vào kho lưu trữ của người khác từ dòng lệnh và thậm chí xem nội dung của họ.

[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

Cộng tác với nhiều nhà phát triển trên cùng một dự án trong Git

Một câu hỏi vẫn là, nếu một nhà phát triển giới thiệu một tệp mới, thì các nhà phát triển khác không thể thay đổi tệp đó, bởi vì bản thân anh ta là chủ sở hữu của nó (ví dụ: dev1) chứ không phải chủ sở hữu người dùng của dự án (ví dụ: proj1). Vì chúng ta có kho lưu trữ phía máy chủ nên trước hết, chúng ta cần biết thư mục “.git” được cấu trúc như thế nào và liệu các tệp mới có được tạo hay không.

Tạo kho lưu trữ Git cục bộ và đẩy lên máy chủ Git

Hãy chuyển sang máy khách.

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>

Đồng thời, các tệp mới được tạo trên máy chủ và chúng thuộc về người dùng đã thực hiện thao tác đẩy

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

Khi bạn tải các thay đổi lên máy chủ Git, các tệp và thư mục bổ sung sẽ được tạo và chủ sở hữu của chúng thực sự là người dùng thực hiện tải lên. Nhưng sau đó nhóm các tệp và thư mục này cũng tương ứng với nhóm chính của người dùng này, tức là nhóm dev1 dành cho người dùng dev1 và nhóm dev2 dành cho người dùng dev2 (việc thay đổi nhóm chính của người dùng nhà phát triển sẽ không giúp ích gì, bởi vì sau đó làm sao bạn có thể làm việc trên nhiều dự án?). Trong trường hợp này, người dùng dev2 sẽ không thể thay đổi các tệp do người dùng dev1 tạo, điều này có thể dẫn đến sự cố về chức năng.

Linux chown - thay đổi chủ sở hữu tệp bởi người dùng thông thường

Chủ sở hữu tập tin không thể thay đổi quyền sở hữu của nó. Nhưng anh ta có thể thay đổi nhóm tệp thuộc về mình và sau đó tệp này có thể được sửa đổi bởi những người dùng khác trong cùng nhóm. Đó là những gì chúng ta cần.

Sử dụng móc Git

Thư mục làm việc của hook là thư mục gốc của dự án. hook là một tệp thực thi chạy dưới sự điều khiển của người dùng thực hiện thao tác đẩy. Biết được điều này, chúng ta có thể thực hiện kế hoạch của mình.

[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

hoặc chỉ

vi hooks/post-update

Hãy quay trở lại máy khách.

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

Trên máy chủ Git, chúng tôi kiểm tra hoạt động của tập lệnh hook post-update sau khi commit

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

- trống rỗng, mọi thứ đều ổn.

Kết nối nhà phát triển thứ hai trong Git

Hãy mô phỏng công việc của nhà phát triển thứ hai.

Trên khách hàng

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

Và đồng thời, trên máy chủ...

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

- lại trống rỗng, mọi thứ đều hoạt động.

Xóa dự án Git và tải xuống dự án từ máy chủ Git

Chà, một lần nữa bạn có thể đảm bảo rằng tất cả các thay đổi đã được lưu.

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

— để xóa một dự án Git, chỉ cần xóa hoàn toàn thư mục. Hãy giải quyết lỗi được tạo ra, vì không thể xóa thư mục hiện tại bằng lệnh này, nhưng đây chính xác là hành vi mà chúng ta cần.

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"

Chia sẻ quyền truy cập trong Git

Bây giờ, hãy đảm bảo rằng ngay cả thông qua Git, nhà phát triển thứ hai cũng không thể truy cập vào dự án Proj1 mà anh ta không làm việc trên đó.

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.

Bây giờ chúng tôi cho phép truy cập

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

và sau đó mọi thứ đều hoạt động.

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

Để biết thêm thông tin,

Ngoài ra, nếu có vấn đề với quyền mặc định khi tạo tệp và thư mục, trong CentOS bạn có thể sử dụng lệnh

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

Ngoài ra trong bài viết bạn có thể vấp phải những điều hữu ích nho nhỏ:

  • cách xây dựng cây thư mục trong Linux
  • cách chuyển một dải địa chỉ trong sed từ một dòng nhất định đến cuối tệp, nghĩa là thay thế sed ở tất cả các dòng ngoại trừ dòng đầu tiên
  • Cách đảo ngược điều kiện tìm kiếm trong Linux
  • Cách chuyển nhiều dòng vào một vòng lặp bằng cách sử dụng một lớp lót trong shell Linux
  • Cách thoát dấu ngoặc đơn trong bash
  • cách xóa một thư mục chứa tất cả nội dung của nó trong dòng lệnh windows
  • Cách sử dụng bash mv để đổi tên tệp mà không cần viết lại

Cảm ơn bạn đã quan tâm của bạn.

Nguồn: www.habr.com

Thêm một lời nhận xét