일반 사용자의 SSH 키와 함께 sudo 파일 권한이 있는 명령(예: git)을 사용하는 방법

일반 사용자의 SSH 키와 함께 sudo 파일 권한이 있는 명령(예: git)을 사용하는 방법

다음과 같이 프로젝트를 복제할 수 있습니다.

$ git clone [email protected]:root/myproject.git ~/bla

하지만 지금은 그것을 복제하고 싶습니다 /var/www. 그래서 나는 노력한다

$ git clone [email protected]:root/myproject.git ~/var/www

하지만 아쉽게도 나는 에 글을 쓸 권한이 없습니다 /var/www. Sudo를 구출해주세요!

$ sudo git clone [email protected]:root/myproject.git ~/var/www
Cloning into 'www'...
[email protected]'s password:

이건 뭐죠? 비밀번호를 묻는 메시지가 표시되나요? 우리는 냄새나는 비밀번호가 필요하지 않습니다!

분명히 요청과 함께 루트 사용자의 SSH 키를 보내고 있는데 해당 키를 git 저장소로 가져오지 않았기 때문에 거부되었습니다. 과거에 내 솔루션은 폴더의 권한을 일시적으로 변경하거나 먼저 액세스할 수 있는 위치에 복제한 다음 sudo를 사용하여 이동하는 것이었지만 올바른 방법을 배우고 싶습니다.

그럼... 일반 사용자의 SSH 키와 함께 git을 사용하지만 sudo 파일 권한은 어떻게 사용합니까?

답변1

에이전트가 실행 중인 경우 다음을 ssh수행합니다.

sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" git clone...

이는 기본적으로 에이전트 git에 의해 시작된 명령 root(또는 ssh해당 git명령에 의해 시작된 명령)이 에이전트를 사용하도록 지시합니다( 모든 권한이 있으므로 연결할 수 있어야 하는 ssh연결 방법 ).root

실행 중인 SSH 에이전트가 없는 경우 다음을 사용하여 미리 시작할 수 있습니다.

eval "$(ssh-agent)"

(그리고 필요에 따라 를 사용하여 키를 추가합니다 ssh-add).

또는 다음을 사용할 수 있습니다.

sudo -E git clone...

넘기기모든뿐만 sudo아니라 $SSH_AUTH_SOCK.

나는~ 아니다$SSH_AUTH_SOCK목록 에 추가하라는 @NgOon-Ee의 의견 제안을 받았습니다 env_keep. 일반적으로 당신 root은 서비스를 시작하는 사용자이기 때문에 의 환경을 오염시키고 싶지 않습니다 . 예를 들어 서비스를 sudo sshd시작한다는 것은 해당 서비스를 통해 시작된 모든 세션이 귀하의 를 상속하고 사용자 환경을 사용할 수 없고 사용해서는 안되는 것으로 오염시키는 것을 sshd의미합니다 . 이외의 다른 대상 사용자의 경우에도 대상 사용자가 해당 인증 에이전트를 사용할 수 없으므로 해당 변수를 전달하는 것은 의미가 없습니다.ssh$SSH_AUTH_SOCKroot

이제 이는 키 인증만 다룹니다. root에서 설정을 상속하려는 경우 환경 변수 ~/.ssh/config로는 그렇게 할 수 없지만 환경 변수 ssh로는 그렇게 할 수 있습니다 git. 예를 들어, sugit함수를 다음과 같이 정의합니다.

sugit() {
  sudo "GIT_SSH_COMMAND=
    exec ssh -o IdentityAgent='$SSH_AUTH_SOCK' \
             -o User=$LOGNAME \
             -F ~$LOGNAME/.ssh/config" git "$@"
}

즉, 루트 대신 SSH 구성 파일과 에이전트 및 사용자 이름을 사용하는 명령을 git사용하라고 지시합니다.ssh

아니면 더 나은 방법은 원래 사용자로 git실행하도록 지시하는 것입니다.ssh

sugit() {
  sudo "GIT_SSH_COMMAND=
    exec sudo -Hu $LOGNAME SSH_AUTH_SOCK='$SSH_AUTH_SOCK' ssh" git "$@"
}

답변2

사용자가 sudo다음으로 실행하여 키 파일(또는 소켓)을 읽을 수 없는 경우 파일(또는 소켓) 권한이 복잡해질 수 있습니다. 여기 root에는 파일이 root권한이 없는 네트워크 공유에 있는 경우 또는 홈 디렉토리가 암호화되어 액세스가 다시 거부되는 경우가 가장 확실하게 포함됩니다 root.

확장 ACL을 지원하는 Unix 시스템의 또 다른 방법은 확장 ACL을 사용하는 것입니다. 이 경우 일반적인 기본 권한 외에 추가 쓰기 액세스 권한을 부여할 수 있습니다.

$ sudo chown apache:www /var/www/html
$ sudo chmod g+s /var/www/html
$ sudo setfacl -m g:webedit:rwx /var/www/html
$ groups
jdoe webedit
$ ls -ld /var/www/html
drwxrwsr-x+ 4 apache www 25 Nov 21 19:42 /var/www/html
$ 

하지만 webedit그룹은 다음 덕분에 권한을 가집니다.setfacl

$ git clone ~/repo /var/www/html
Cloning into '/var/www/html'...
done.
$ ls -al /var/www/html
total 0
drwxrwsr-x+ 4 apache www   25 Nov 21 19:42 .
drwxr-xr-x  4 root   root  31 Oct 19 20:39 ..
drwxrwsr-x  3 jdoe   www   14 Nov 21 19:42 a
drwxrwsr-x  8 jdoe   www  152 Nov 21 19:42 .git
$ 

그러나 확장 ACL에는 다양한 문제점이 있습니다. 예를 들어 백업 소프트웨어가 ACL을 처리하는 방법을 확인하는 등의 문제가 있습니다.

관련 정보