Shell terbatas untuk mengelola file dan git repositori

8

Pikirkan tentang perusahaan hosting web yang ingin membiarkan pengguna mengelola file dan menerima repositori melalui ssh. Ini termasuk:

  • salinan aman (scp)
  • membuat, menyalin, memindahkan / mengganti nama dan menghapus file
  • mengeksekusi sebagian kecil perintah untuk kontrol sumber dan pengeditan teks (git, vim, nano)

Kami ingin menerapkan itu dan melihat ke opsi berikut:

Ini akan memungkinkan untuk bagian scp, tetapi menggunakan git sepertinya tidak mungkin. Ada tambalan di Launchpad , tapi saya tidak yakin apa yang membuatnya. Ada juga git-shell , tetapi sepertinya tidak mengizinkan editor. Mungkin vim bahkan terlalu banyak, karena bisa digunakan untuk mengeksekusi lebih banyak kode, jadi kita bisa menghapusnya (vim, atau editor teks sepenuhnya, jika harus) jika terlalu banyak.

Kami pada dasarnya ingin mengunci shell, sehingga pengguna dapat mengelola (dan mengedit) file dan git repositori, tetapi pengguna seharusnya tidak dapat menjalankan program lain pada sistem. Masalah terbesar adalah penyalahgunaan sumber daya jaringan dan komputasi, tetapi menggunakan sistem sebagai proxy juga. Sebut saja. Apakah ada cara untuk melakukan ini atau kita bahkan mungkin memiliki pendekatan yang salah pada masalah ini?

Phillipp
sumber

Jawaban:

8

Anda memiliki dua cara pelengkap untuk mengimplementasikan ini:

Memberikan izin kepada pengguna untuk menggunakan gitrepositori dari jarak jauh

Gunakan gitolite3untuk menyediakan skema repositori hub-live (ini dijelaskan secara rinci di sini ), yang pada dasarnya mengharuskan Anda untuk memiliki barerepositori ( repo hub ) untuk memungkinkan pengguna Anda mendorong / menarik dari dan versi check-out dari repo yang sama ( repo langsung ) yang terletak di jalur yang sesuai, misalnya /srv/www/html, misalnya.

Saya suka menggunakan gitolite3untuk menangani hub repo, tapi itu bukan persyaratan, meskipun agak nyaman untuk memiliki kontrol akses berbutir halus terikat dengan LDAP pilihan Anda jika perlu. gitolite3dapat memberikan kendali halus hingga ke tingkat cabang.

Ini juga merupakan praktik yang baik untuk membatasi kemampuan gitolite3pengguna melalui sudo, dan menangani kait melalui sudopanggilan. Ini adalah contoh kerja menggunakan gitolite3kait (jangan ragu untuk menyesuaikannya - atau meningkatkan / memperbaikinya - sesuai dengan kebutuhan Anda):

  • Konten yang relevan dari /etc/sudoersatau /etc/sudoers.d/gitolite3akan menjadi sesuatu di sepanjang baris:

    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
    
  • hub repo post-updatehook:

    #!/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 naskah:

    #!/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
    

Membatasi kemampuan untuk mengeksekusi perintah yang tidak diotorisasi dalam shell login

Apa yang Anda perlu terapkan adalah metode yang dapat direproduksi dan dapat diaudit yang membatasi kemampuan pengguna untuk melakukan tindakan selain yang diizinkan secara ketat.

Ini tidak diperlukan tetapi akan membantu jika Anda memiliki pengguna terdaftar di LDAP, dan Anda telah menggunakan mekanisme untuk melakukan otentikasi LDAP, baik itu melalui modul PAM, atau menggunakan freeIPA dan sssd.

Untuk menerapkan skenario ini, apa yang saya lakukan saat ini adalah sebagai berikut (perlu diketahui bahwa pembatasan semacam ini mengharuskan beberapa kondisi terpenuhi, jika tidak, pembatasan dapat dengan mudah dielakkan):

  • Pengguna bukan milik wheelgrup, satu-satunya yang diizinkan untuk menggunakan su(diberlakukan melalui PAM). Biasanya, pengguna non-LDAP ( sysadm) ada untuk memungkinkan administrator tepercaya melakukan tindakan dalam kasus pemulihan bencana atau tidak tersedianya LDAP.
  • Para pengguna diberi tanda aman yang benar rbashdengan PATH hanya baca yang mengarah ke pribadi ~/bin, ~/bin/direktori ini berisi tautan ke semua perintah yang diizinkan, misalnya:

    $ 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*
    
  • pengguna diberi dibatasi, read-only lingkungan (memikirkan hal-hal seperti LESSSECURE, TMOUT, HISTFILEvariabel). Ini untuk menghindari shelllolos dari perintah seperti lessdan memastikan kemampuan audit.

  • satu-satunya editor yang diizinkan adalah rvim, untuk alasan yang sama. Pengguna hanya dapat mengeksekusi sudoedit, yang dikonfigurasi untuk berjalan rvimdalam sudokonfigurasi:

    Defaults editor=/usr/bin/rvim
    
  • jika pembatasan MAC diterapkan (distribusi GNU / Linux spesifik yang Anda gunakan telah mengaktifkan SELinux), pengguna dipetakan ke pengguna SELinux staff_udan diberikan hak untuk mengeksekusi perintah sebagai pengguna lain sebagaimana diharuskan melalui sudo. Kebutuhan khusus yang sudorulesdiizinkan harus ditinjau dengan cermat untuk mencegah pengguna menghindari batasan-batasan ini, dan juga dapat digunakan dalam infrastruktur LDAP Anda yang ada (ini adalah salah satu fitur freeIPA).

  • pengguna /home, /tmpdan mungkin /var/tmpdipolisiasi melalui /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
    

    Polyinstantiation direktori bukan fitur baru, sudah tersedia cukup lama sekarang. Sebagai referensi, lihat artikel ini dari 2006 . Faktanya, banyak modul yang sudah digunakan pam_namespacesecara default, tetapi konfigurasi default di /etc/security/namespace.conftidak mengaktifkan polyinstantiation. Juga, /etc/security/namespace.initharus membuat semua file kerangka hanya-baca untuk pengguna dan dimiliki oleh root.

Dengan cara ini Anda dapat memilih apakah pengguna dapat menjalankan perintah atas nama mereka sendiri (melalui tautan di ~/bindirektori pribadi , disediakan melalui /etc/skel, seperti dijelaskan di atas), atas nama pengguna lain (via sudo) atau tidak sama sekali.

dawud
sumber