Git cam kết kiểm toán


16

Tôi có một máy chủ git chạy trên ssh và mỗi người dùng có một tài khoản unix trên hệ thống.

Cho rằng hai người dùng có quyền truy cập vào một repo, làm thế nào tôi có thể chắc chắn người dùng nào đã thực hiện cam kết đó, vì tên người dùng và email cam kết được gửi và kiểm soát bởi ứng dụng khách git.

Tôi lo ngại rằng người dùng có thể cố gắng mạo danh người khác, ngay cả khi họ có quyền ủy quyền tương tự.


Tôi bối rối. Bạn nói trong câu hỏi rằng mỗi người dùng có tài khoản shell riêng, nhưng trong một bình luận bạn nói rằng tất cả họ đều chia sẻ một tài khoản và sử dụng các khóa riêng để xác thực. Đó là nó, hoặc là cả hai?
Scott Pack

Có thể là một trong hai. Thiết lập hiện tại là một thiết lập được mô tả trong câu hỏi (một tài khoản ssh cho mỗi người dùng), nhưng điều này không có quy mô tốt và tôi có thể muốn đi với một người dùng / nhiều khóa trong tương lai. Tôi chỉ tìm kiếm giải pháp linh hoạt nhất sẽ không khóa tôi vào một hoặc một phương thức xác thực khác.
yannisf

1
Thật đáng để chỉ ra rằng "người thực hiện cam kết" và "người đưa ra một số cam kết cho repo này" không nhất thiết phải giống nhau trong trường hợp chung. Tôi có thể rút các cam kết của bạn từ repo của bạn và sau đó đẩy chúng (như tôi) sang repo của bên thứ ba.
nickgrim

Câu trả lời:


13

Nếu bạn lo lắng về điều đó, có một vài cách để giải quyết vấn đề.

  1. Làm cho người dùng của bạn ký cam kết của bạn, có hỗ trợ cho việc ký GPG.
  2. Đừng cho người dùng quyền cam kết với kho lưu trữ chính, hãy để họ cam kết với phần phụ của chính họ và sau đó yêu cầu người dùng đáng tin cậy mang các thay đổi vào kho lưu trữ chính. Đó là lý do tại sao nếu bạn xem các thông điệp tường trình cho một số dự án git (chẳng hạn như git), bạn sẽ thấy rằng chúng là các trường riêng biệt cho "Tác giả" - người tạo ra thay đổi. và "Committer" - người đã cam kết thay đổi vào kho lưu trữ.

1. Đề nghị này có vẻ là thích hợp nhất cho mục đích của tôi. Tuy nhiên, có một cơ chế để từ chối các cam kết không dấu ở phía máy chủ không? 2. Theo như giải pháp này, người dùng kéo từ repo cấp dưới sẽ phải kiểm tra lại xem người ủy quyền chưa sử dụng giả mạo tên người dùng / email. Thật?
yannisf

Mặc dù vậy, hãy cẩn thận, bạn có thể ký cam kết với bất kỳ danh tính tác giả và tác giả nào mà bạn quan tâm để chọn. Rõ ràng, bạn sẽ có thể biết ai đã giả mạo (hoặc không chăm sóc khóa riêng của họ).
CB Bailey

Do đó, tôi cảnh báo về việc chỉ có người dùng đáng tin cậy cam kết với kho lưu trữ chính.
Abizern

@Abizern: Đủ công bằng. Khi tôi đọc nó, (1) và (2) của bạn dường như được mô tả các tùy chọn thay thế.
CB Bailey

1
@yannisf Liên quan đến câu hỏi đầu tiên của bạn, hook cập nhật (chạy phía máy chủ) có thể kiểm tra chữ ký và từ chối cập nhật các ref tương ứng. Có một cái nhìn vào .git/hooks/update.samplecho cảm hứng. Vui lòng thông báo cho tôi nếu bạn đặt câu hỏi về vấn đề này tại SO, điều đó cũng rất thú vị đối với tôi
Tobias Kienzler

9

Tôi thấy hai cách tốt để có được loại thông tin này. Một là bằng cách tăng ghi nhật ký từ chính sshd, và thứ hai bằng cách giám sát sâu hơn kho lưu trữ git trên đĩa. Vì không ai cung cấp cho bạn thông tin bạn muốn, bạn có thể muốn thực hiện cả hai và tương quan dữ liệu nhật ký bằng cách sử dụng công cụ phân tích nhật ký bên ngoài hoặc theo yêu cầu bằng mắt người và dấu thời gian.

Sửa đổi sshd

Theo mặc định, như bạn không nghi ngờ gì, bạn có thể thấy khi người dùng đăng nhập và từ đâu, sử dụng nhật ký xác thực ssh. Những gì bạn muốn làm là thay đổi cấp độ với việc bạn đăng xuất khỏi sshd. Vì vậy, chỉnh sửa của bạn /etc/ssh/sshd_configvà tìm dòng giống như

#LogLevel INFO

và thay đổi nó thành

LogLevel VERBOSE

sau đó khởi động lại dịch vụ sshd. Điều này làm tăng mức ghi nhật ký của sshd thêm 1 bước, cung cấp nhiều thông tin hơn. Kiểm tra đoạn nhật ký này của truy cập từ xa của tôi sau khi thực hiện thay đổi đó.

Nov  2 08:37:09 node1 sshd[4859]: Connection from 10.10.10.5 port 50445
Nov  2 08:37:10 node1 sshd[4859]: Found matching RSA key: f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06
Nov  2 08:37:10 node1 sshd[4860]: Postponed publickey for scott from 10.10.10.5 port 50445 ssh2
Nov  2 08:37:10 node1 sshd[4859]: Found matching RSA key: f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06
Nov  2 08:37:10 node1 sshd[4859]: Accepted publickey for scott from 10.10.10.5 port 50445 ssh2
Nov  2 08:37:10 node1 sshd[4859]: pam_unix(sshd:session): session opened for user scott by (uid=0)
Nov  2 08:37:10 node1 sshd[4859]: User child is on pid 4862
Nov  2 08:40:27 node1 sshd[4862]: Connection closed by 10.10.10.5
Nov  2 08:40:27 node1 sshd[4862]: Transferred: sent 30632, received 7024 bytes
Nov  2 08:40:27 node1 sshd[4862]: Closing connection to 10.10.10.5 port 50445
Nov  2 08:40:27 node1 sshd[4859]: pam_unix(sshd:session): session closed for user scott 

Những điều quan trọng cần chú ý ở đây là hai lần

  1. Chúng tôi thấy dấu vân tay của khóa công khai được sử dụng để xác thực tôi
  2. Chúng tôi thấy dấu thời gian đăng xuất của tôi

Sử dụng sshd LogLevel (INFO) mặc định sẽ không ghi các mục đó. Lấy dấu vân tay của một phím là một bước thêm. Bạn phải xử lý authorized_keystệp thích hợp với ssh-keygen như vậy.

[root@node1 ssh]# ssh-keygen -l -f /home/scott/.ssh/authorized_keys
4096 f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06 /home/scott/.ssh/authorized_keys (RSA)

Vì vậy, bây giờ bạn biết các mẩu thông tin sau:

  1. Tên đăng nhập
  2. Thời gian người dùng đăng nhập
  3. Khóa công khai nào đã được sử dụng để xác thực
  4. Thời gian người dùng đăng xuất

Bây giờ chúng ta có một cách để quy kết hành động của người dùng tại một thời điểm cụ thể, giả sử cả hai người dùng không đăng nhập cùng một lúc, chúng ta có thể bắt đầu xem xét các thay đổi được thực hiện cho kho lưu trữ.

Giám sát thư mục với Auditd

Như sysadmin1138 đã nói, đây có thể là một trường hợp sử dụng tuyệt vời cho hệ thống con Audd. Nếu bạn không sử dụng bản phân phối dựa trên RedHat thì có thể có một loại tương tự, nhưng bạn sẽ phải tìm nó. Cấu hình cho Audd khá mãnh liệt và có số lượng tùy chọn cấu hình lớn. Để có ý tưởng về một số tùy chọn, vui lòng xem câu hỏi này trên trang web dành cho Chuyên gia An toàn Thông tin của chúng tôi .

Tối thiểu, tôi khuyên bạn nên thiết lập cái được gọi là "đồng hồ" trên thư mục trên đĩa có chứa kho git của bạn. Những gì nó làm là hướng dẫn mô-đun hạt nhân báo cáo về các nỗ lực thực hiện các cuộc gọi truy cập tệp, chẳng hạn như open(), hoặc creat()trên các tệp xử lý tệp trỏ đến các tệp hoặc thư mục chúng tôi liệt kê.

Đây là một cấu hình mẫu sẽ làm điều này và chỉ có điều này. Vì vậy, hãy cẩn thận để đọc qua và hiểu, hiện tại của bạn /etc/audit/audit.rulesđể tích hợp các thay đổi một cách thích hợp.

# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.

# First rule - delete all
-D

# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 1024

-w /path/to/git/repos-p wa

# Disable adding any additional rules - note that adding *new* rules will require a reboot
-e 2

cảm ơn bạn rất nhiều vì câu trả lời chi tiết của bạn Nó thực sự là hoàn thành từ một quan điểm quản trị hệ thống. Mặc dù vậy, điều tôi đang tìm kiếm là một giải pháp không cần giải quyết vấn đề kiểm toán ở mức độ thấp như vậy, và lý tưởng sẽ ngăn chặn các cam kết giả mạo thay vì giải quyết pháp y sau thực tế.
yannisf

2
Chà, bạn đã hỏi trên một trang Quản trị Hệ thống và tôi là một giám định viên pháp y .... :)
Scott Pack

5

Phương pháp kỹ thuật duy nhất mà bạn có thể thực hiện là tin tưởng vào danh tính của kết nối ssh. Sau đó, bạn có thể thực thi rằng mỗi người dùng chỉ đẩy các cam kết mà anh ta đã thực hiện bằng cách xác thực người ủy quyền của mỗi cam kết được đẩy mới.

Để điều này trở nên đáng tin cậy, bạn gần như chắc chắn không muốn cung cấp cho người dùng của mình quyền truy cập shell không giới hạn vào hộp chứa kho lưu trữ; bạn sẽ muốn đảm bảo việc sử dụng một cái gì đó giống như git-shellchỉ có các hạn chế được thực hiện dễ dàng xung quanh.

Người dùng vẫn có thể mạo danh nhau như các tác giả, mặc dù. Bạn cũng có thể hạn chế điều này nhưng điều này sẽ làm mất các quy trình công việc phổ biến như hái anh đào và nổi loạn và thậm chí có thể phân nhánh (tùy thuộc vào việc thực hiện hook của bạn) vì vậy bạn có thể không muốn làm điều này.

Tại một số điểm, ở một mức độ nào đó, bạn cần tin tưởng các nhà phát triển của mình.


3

Nhiều trình nền ssh tạo một mục trong /var/log/audit.loghoặc một cái gì đó tương tự khi nhận được kết nối ssh. Tham chiếu chéo nhật ký này với nhật ký cam kết sẽ cho bạn ý tưởng về việc người dùng ssh đã được sử dụng để phát hành cam kết. Đây là một bước kiểm toán, sẽ được sử dụng sau khi thực tế để xác minh.

Trên thực tế, việc ép buộc người dùng ssh chính xác cho người dùng git thích hợp là một trong những câu trả lời khác ở đây.


Vẫn có thiết lập mà người dùng đăng nhập với cùng một người dùng ssh nhưng sử dụng các khóa (được ủy quyền) khác nhau. Điều này làm cho việc kiểm toán thậm chí khó khăn hơn.
yannisf

@yannisf: Bạn nói đúng, điều đó thay đổi mọi thứ một chút. Với bất kỳ may mắn nào, tôi đã giúp giải quyết nhu cầu thêm của bạn trong việc xử lý truy cập tài khoản không quy kết.
Scott Pack

0

Nếu tất cả người dùng có tài khoản shell có quyền truy cập ghi vào kho lưu trữ, bạn sẽ không thể thiết lập nhật ký kiểm toán đáng tin cậy: họ vẫn có thể sửa đổi kho lưu trữ mà không cần ghi vào nhật ký và họ có thể viết bất cứ điều gì họ muốn vào nhật ký.

Để có thể tin tưởng vào nhật ký kiểm toán, bạn cần ngăn chặn quyền truy cập ghi cấp độ tệp trực tiếp vào kho lưu trữ, thay vào đó sử dụng một cái gì đó như gitolite (chạy trong tài khoản của chính nó) để trung gian truy cập vào kho lưu trữ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.