Shell bị hạn chế để quản lý tập tin và kho git


8

Hãy suy nghĩ về một công ty lưu trữ web muốn cho phép người dùng quản lý các tệp và git kho thông qua ssh. Điêu nay bao gôm:

  • bản sao an toàn (scp)
  • tạo, sao chép, di chuyển / đổi tên và xóa các tập tin
  • thực thi một tập hợp con hẹp của các lệnh để kiểm soát nguồn và chỉnh sửa văn bản (git, vim, nano)

Chúng tôi muốn thực hiện điều đó và xem xét các tùy chọn sau:

Những thứ này sẽ cho phép phần scp, nhưng sử dụng git dường như là không thể. Có một bản vá trong Launchpad , nhưng tôi không biết phải làm gì với nó. Cũng có git-shell , nhưng dường như nó không cho phép các biên tập viên. Có thể vim thậm chí là quá nhiều, vì nó có thể được sử dụng để thực thi nhiều mã hơn, vì vậy chúng tôi có thể loại bỏ hoàn toàn (vim hoặc trình soạn thảo văn bản, nếu phải) nếu quá nhiều.

Về cơ bản, chúng tôi muốn khóa vỏ, vì vậy người dùng có thể quản lý (và chỉnh sửa) tệp và kho git, nhưng người dùng không thể thực hiện bất kỳ chương trình nào khác trên hệ thống. Vấn đề lớn nhất sẽ là lạm dụng tài nguyên mạng và máy tính, nhưng cũng sử dụng hệ thống như một proxy. Bạn đặt tên cho nó. Có cách nào để làm điều này hay chúng ta thậm chí có thể có cách tiếp cận sai về vấn đề này?

Câu trả lời:


8

Bạn có hai cách bổ sung để thực hiện điều này:

Cấp quyền cho người dùng sử dụng gitkho lưu trữ từ xa

Sử dụng gitolite3để cung cấp lược đồ kho lưu trữ trực tiếp trung tâm (điều này được mô tả chi tiết tại đây ), về cơ bản yêu cầu bạn phải có một barekho lưu trữ (một trung tâm repo) để cho phép người dùng của bạn đẩy / kéo và một phiên bản kiểm tra của cùng một repo (một repo trực tiếp ) nằm trong đường dẫn thích hợp /srv/www/html, ví dụ.

Tôi thích sử dụng gitolite3để xử lý repo trung tâm , nhưng đó không phải là một yêu cầu, mặc dù việc kiểm soát truy cập chi tiết tốt ràng buộc với LDAP của bạn nếu cần. gitolite3có thể cung cấp kiểm soát hạt mịn xuống cấp chi nhánh.

Nó cũng là một thực hành tốt để hạn chế khả năng của gitolite3người dùng thông qua sudovà xử lý các hook bằng các sudocuộc gọi. Đây là một ví dụ hoạt động bằng cách sử dụng các gitolite3móc (thoải mái điều chỉnh chúng - hoặc nâng cao / sửa chúng - để phù hợp với nhu cầu của bạn):

  • Nội dung có liên quan của /etc/sudoershoặc /etc/sudoers.d/gitolite3sẽ là một cái gì đó dọc theo dòng:

    Cmnd_Alias        GITOLITE_CMDS = /usr/bin/git, /bin/chown, /bin/find, /usr/bin/xargs, /bin/chmod, /sbin/restorecon, /usr/local/sbin/publisher-hub2live
    Cmnd_Alias GITOLITE_APACHE_CMDS = /usr/sbin/apachectl graceful
    Defaults:gitolite3 !requiretty
    Defaults:gitolite3 lecture=never
    gitolite3                ALL = (root)NOPASSWD: GITOLITE_CMDS
    gitolite3       APACHE_HOSTS = (root)NOPASSWD: GITOLITE_APACHE_CMDS
    
  • post-updatemóc repo trung tâm :

    #!/bin/sh
    
    echo "****"
    echo "**** Calling publisher-hub2live script [Hub's post-update hook]"
    echo "****"
    
    sudo /usr/local/sbin/publisher-hub2live "/srv/www/html" "root:apache" "2750" "640"
    
    exit 0
    
  • publisher-hub2live kịch bản:

    #!/bin/sh
    
    echo "****"
    echo "**** Pulling changes into Live [publisher-hub2live]"
    echo "****"
    
    cd "$1" || exit
    umask 0022
    unset GIT_DIR
    /usr/bin/git pull hub master
    
    # custom actions here
    # e.g call grunt tasks
    /bin/chown -R "$2" "$1"
    /bin/find "$1" -type d -exec chmod "$3" {} +
    /bin/find "$1" -type f -exec chmod "$4" {} +
    /bin/chmod u+x "$1"/.git/hooks/post-commit
    /sbin/restorecon -R -v "$1"
    exec /usr/bin/git update-server-info
    
    exit 0
    

Giới hạn khả năng thực thi các lệnh không được ủy quyền trong trình đăng nhập

Những gì bạn cần thực hiện là một phương pháp có thể lặp lại, có thể kiểm tra được để giới hạn khả năng của người dùng thực hiện các hành động khác với sự cho phép nghiêm ngặt.

Không bắt buộc nhưng nó giúp nếu người dùng của bạn đã đăng ký LDAP và bạn đã triển khai các cơ chế để thực hiện xác thực LDAP, bằng mô-đun PAM hoặc sử dụng freeIPA và sssd.

Để thực hiện kịch bản này, những gì tôi hiện đang làm là như sau (lưu ý rằng loại hạn chế này yêu cầu một số điều kiện được đáp ứng, nếu không, hạn chế có thể dễ dàng bị phá vỡ):

  • Người dùng không thuộc wheelnhóm, người duy nhất được phép sử dụng su(được thi hành thông qua PAM). Thông thường, người dùng không phải là LDAP ( sysadm) tồn tại để cho phép các quản trị viên đáng tin cậy thực hiện các hành động trong các trường hợp khắc phục thảm họa hoặc không có LDAP.
  • Người dùng được bảo mật đúng cách rbashvới PATH chỉ đọc được trỏ đến riêng tư ~/bin, ~/bin/thư mục này chứa các liên kết đến tất cả các lệnh được phép, ví dụ:

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 git -> /usr/bin/git*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
  • người sử dụng được cung cấp một hạn chế, read-only môi trường (nghĩ về những thứ như thế LESSSECURE, TMOUT, HISTFILEbiến). Điều này là để tránh shellthoát khỏi các lệnh như lessvà đảm bảo kiểm toán.

  • trình soạn thảo được phép duy nhất là rvim, vì lý do tương tự. Người dùng chỉ có thể thực thi sudoedit, trong khi được cấu hình để chạy rvimtrong sudocấu hình:

    Defaults editor=/usr/bin/rvim
    
  • nếu có các hạn chế MAC (bản phân phối GNU / Linux cụ thể mà bạn đang sử dụng đã bật SELinux), người dùng sẽ được ánh xạ tới người dùng SELinux staff_uvà được cấp quyền để thực thi các lệnh như người dùng khác theo yêu cầu thông qua sudo. Yêu cầu cụ thể sudorulescần được xem xét cẩn thận để ngăn người dùng tránh được những hạn chế này và cũng có thể được triển khai trong cơ sở hạ tầng LDAP hiện tại của bạn (đây là một trong những tính năng của FreeIPA).

  • người sử dụng /home, /tmpvà có thể /var/tmpđược polyinstantiated qua /etc/security/namespace.conf:

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    

    Đa thông tin của các thư mục không phải là một tính năng mới, nó đã có sẵn từ khá lâu rồi. Để tham khảo, xem bài viết này từ năm 2006 . Như một vấn đề thực tế, rất nhiều mô-đun đã được sử dụng pam_namespacetheo mặc định, nhưng cấu hình mặc định tại /etc/security/namespace.confkhông cho phép đa thông tin. Ngoài ra, /etc/security/namespace.initnên làm cho tất cả các tệp bộ xương chỉ đọc cho người dùng và được sở hữu bởi root.

Bằng cách này, bạn có thể chọn xem người dùng có thể thực hiện bất kỳ lệnh nào thay mặt họ (thông qua một liên kết trong ~/binthư mục riêng , được cung cấp qua /etc/skel, như đã giải thích ở trên), thay mặt cho người dùng khác (thông qua sudo) hoặc không có gì cả.

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.