파일 및 자식 저장소 관리를위한 제한된 쉘


8

사용자가 ssh를 통해 파일 및 git 저장소를 관리하게하려는 웹 호스팅 회사를 생각해보십시오. 여기에는 다음이 포함됩니다.

  • 보안 사본 (scp)
  • 파일 작성, 복사, 이동 / 이름 바꾸기 및 삭제
  • 소스 제어 및 텍스트 편집을위한 좁은 명령의 하위 세트 실행 (git, vim, nano)

이를 구현하고 다음 옵션을 조사했습니다.

이것들은 scp 부분을 허용하지만 git 사용은 가능하지 않은 것 같습니다. Launchpad에 패치가 있지만 무엇을 만들어야할지 모르겠습니다. 이 자식 - 쉘 도 있지만, 편집자을 허용하지 않는 것 같습니다. 더 많은 코드를 실행하는 데 사용될 수 있기 때문에 vim이 너무 많을 수도 있으므로 너무 많으면 vim 또는 텍스트 편집기를 완전히 삭제할 수 있습니다.

우리는 기본적으로 쉘을 잠그기를 원하므로 사용자는 파일과 git 저장소를 관리하고 편집 할 수 있지만 시스템에서 다른 프로그램을 실행할 수는 없습니다. 가장 큰 문제는 네트워크 및 컴퓨팅 리소스의 남용이지만 시스템을 프록시로 사용하는 것입니다. 원하는대로 말만 해. 이 작업을 수행 할 수있는 방법이 있습니까, 아니면이 문제에 대한 잘못된 접근 방식이 있습니까?

답변:


8

이를 구현하는 두 가지 보완 방법이 있습니다.

사용자에게 git저장소를 원격으로 사용할 수있는 권한 부여

gitolite3허브 라이브 리포지토리 스키마를 제공하는 데 사용 합니다 ( 여기 에 자세히 설명되어 있음). 기본적으로 사용자가 동일한 bare리포지토리의 푸시 / 풀링 버전과 체크 아웃 된 버전 을 갖도록 리포지토리 ( 허브 리포지토리) 가 있어야합니다. (예 : 라이브 리포지토리)는 적절한 경로 /srv/www/html에 있습니다 (예 :).

허브 리포지토리 gitolite3를 처리하는 데 사용 하고 싶지만 요구 사항은 아니지만 필요한 경우 원하는 LDAP에 세분화 된 액세스 제어를 바인딩하는 것이 편리 합니다. 분기 수준까지 세밀한 제어를 제공 할 수 있습니다.gitolite3

또한를 gitolite3통해 사용자 의 기능을 제한하고 통화 를 통해 sudo후크를 처리 하는 것이 좋습니다 sudo. 이것은 gitolite3후크 를 사용하는 실례입니다 (필요에 따라 자유롭게 조정하거나 수정 / 고정하십시오).

  • /etc/sudoers또는 의 관련 내용은 /etc/sudoers.d/gitolite3다음과 같습니다.

    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-update후크 :

    #!/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 스크립트:

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

로그인 쉘에서 권한이없는 명령을 실행하는 기능 제한

구현해야하는 것은 사용자가 엄격하게 허용되는 것 이외의 작업을 수행 할 수있는 능력을 제한하는 재현 가능하고 감사 가능한 방법입니다.

필수는 아니지만 사용자가 LDAP에 등록되어 있고 PAM 모듈 또는 freeIPA 및를 사용하여 LDAP 인증을 수행하는 메커니즘을 이미 배포 한 경우 도움이됩니다 sssd.

이 시나리오를 구현하려면 현재 수행중인 작업은 다음과 같습니다 (이러한 종류의 제한은 몇 가지 조건을 충족해야하며, 그렇지 않으면 제한을 쉽게 피할 수 있음).

  • 사용자는 wheel그룹 에 속하지 않으며 사용 권한이있는 유일한 그룹입니다 su(PAM을 통해 시행). 일반적으로 비 LDAP 사용자 ( sysadm)는 재난 복구 또는 LDAP를 사용할 수없는 경우 신뢰할 수있는 관리자가 작업을 수행 할 수 있도록하기 위해 존재합니다.
  • 사용자에게 rbashprivate을 가리키는 읽기 전용 PATH 로 적절히 보안이 제공 되며이 디렉토리에는 ~/bin다음과 같이 ~/bin/허용 된 모든 명령에 대한 링크가 포함됩니다.

    $ 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*
    
  • 사용자에게는 제한된 읽기 전용 환경이 제공됩니다 (예 LESSSECURE: TMOUT, HISTFILE변수 등). 이는 감사 shell명령과 같은 명령에서 less이탈 을 피하기 위한 것입니다.

  • rvim같은 이유로 허용되는 유일한 편집기는 입니다. 사용자는 실행할 수 sudoedit있는 whic 실행하도록 구성 rvimsudo구성 :

    Defaults editor=/usr/bin/rvim
    
  • MAC 제한이있는 경우 (사용중인 특정 GNU / Linux 배포판에 SELinux가 활성화되어있는 경우) 사용자는 SELinux 사용자에 매핑되고을 staff_u통해 다른 사용자로 명령을 실행할 수있는 권한이 부여됩니다 sudo. sudorules사용자가 이러한 제한을 피하지 못하도록 허용 된 특정 사항 을주의 깊게 검토해야하며 기존 LDAP 인프라 (freeIPA 기능 중 하나)에도 배포 할 수 있습니다.

  • 사용자가 ' /home, /tmp그리고 아마도 /var/tmp통해 polyinstantiated 있습니다 /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
    

    디렉토리의 다중 인스턴스화는 새로운 기능이 아니며, 꽤 오랫동안 사용되었습니다. 참고 로 2006 년이 기사를 참조하십시오 . 사실상 많은 모듈이 pam_namespace기본적으로 이미 사용 하고 있지만 기본 구성은 /etc/security/namespace.conf다중 인스턴스화를 활성화하지 않습니다. 또한 /etc/security/namespace.init모든 스켈 레탈 파일을 사용자가 읽기 전용으로 소유해야합니다 root.

이 방법으로 사용자 가 다른 사용자를 대신하여 (위에 설명 된대로 개인 ~/bin디렉토리 의 링크를 통해 /etc/skel,을 통해 프로비저닝 된) 개인을 대신하여 명령을 실행할 수 있는지 또는 전혀 사용하지 않을 수 있습니다 sudo.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.