![일반 사용자의 SSH 키를 사용하지만 모든 명령(예: git)에 대해 sudo 파일 권한을 갖는 방법](https://linux55.com/image/122128/%EC%9D%BC%EB%B0%98%20%EC%82%AC%EC%9A%A9%EC%9E%90%EC%9D%98%20SSH%20%ED%82%A4%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80%EB%A7%8C%20%EB%AA%A8%EB%93%A0%20%EB%AA%85%EB%A0%B9(%EC%98%88%3A%20git)%EC%97%90%20%EB%8C%80%ED%95%B4%20sudo%20%ED%8C%8C%EC%9D%BC%20%EA%B6%8C%ED%95%9C%EC%9D%84%20%EA%B0%96%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
다음과 같이 프로젝트를 복제할 수 있습니다.
$ 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 키와 함께 sudo 파일 권한을 사용하여 git을 어떻게 사용합니까?
답변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
.
저 할 수 있어요아니요댓글에서 @NgOon-Ee가 제안한 대로 목록 $SSH_AUTH_SOCK
에 추가되었습니다 env_keep
. 일반적으로 root
서비스를 시작한 사용자는 환경을 오염시키고 싶지 않습니다 . 예를 들어 sudo sshd
, 서비스를 시작한다는 것은 해당 서비스를 통해 시작된 모든 세션이 사용자 환경을 상속하고 사용할 수 없고 사용해서는 안되는 것으로 사용자 환경을 오염시킨다는 것을 sshd
의미합니다 . 대상 사용자가 인증 프록시를 사용할 수 없으므로 대상 사용자가 아닌 대상 사용자에 대해서도 이 변수를 전달할 필요가 없습니다.ssh
$SSH_AUTH_SOCK
root
이제 이는 키 인증 문제만 해결합니다. 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을 처리하는 방법 확인 등 다양한 문제가 있습니다.