보안: SSH 인증을 사용하는 Git 서버

보안: SSH 인증을 사용하는 Git 서버
  1. 사용자 'git-server'를 만들었습니다.
  2. 설치됨openssh-server
  3. 수정 /etc/ssh/sshd_config추가됨PasswordAuthentication no
  4. .ssh/authorized_keys내 동료의 공개 사례 에 추가됨

질문:

  • 내 시스템에서 'git-server' 사용자는 안전한가요? 'git-server'가 'git-server'라는 사실을 전제로 범죄자가 'git-server'에 액세스할 경우 시스템에 대한 최악의 시나리오는 무엇입니까?sudoer
  • 명령 과 별도로 모든 작업을 'git-server'로 금지하려면 어떻게 해야 합니까 git?

답변1

사용자 git-server의 기본 쉘을 git-shell로 변경해야 합니다.

https://git-scm.com/docs/git-shell.html

이는 제한된 Git 액세스를 제공하기 위한 SSH 계정용 로그인 셸입니다. 풀/푸시 기능을 구현하는 서버 측 Git 명령과 사용자 홈 디렉터리의 git-shell-commands라는 하위 디렉터리에 있는 사용자 지정 명령만 실행할 수 있습니다.

답변2

이제 시스템에서 git-server 계정을 설정하는 방법을 살펴보겠습니다.

수정됨 /etc/ssh/sshd_config에 PasswordAuthentication no가 추가됨

비밀번호 인증을 no로 설정했기 때문에 유효한 SSH 키가 없으면 해당 이름으로 시스템에 원격으로 로그인하는 것이 사실상 불가능합니다. 내가 아는 한, SSH 키가 깨졌다고 생각하지 않습니다. 이는 이를 결정하는 데 사용하는 암호 및 암호 복잡성에 따라 달라집니다.

이제 누군가가 해당 계정에 액세스할 수 있다면 그 사실은 사라집니다. 이는 su를 사용할 수 있는 권한이 부여된 시스템에 이미 액세스한 사람이 그렇게 했을 것이라는 의미일 가능성이 높습니다. 또는 시스템을 올바르게 잠근 경우 누군가 루트에 액세스할 수 있게 되었다는 의미일 수 있습니다. 이는 루트에 대한 액세스 권한을 얻는 것보다 더 불가능한 일입니다. git-서버 계정. 그러나 그렇지 않고 SSH를 사용하여 원격으로 해당 계정에 로그인한 경우 SSH를 사용하는 모든 사람은 문제에 처하게 됩니다. 이는 SSH를 사용하는 모든 시스템이 취약해질 수 있음을 의미하기 때문입니다. 이제 발생할 수 있는 최대 피해는 sudo 권한이 있는 일반 계정으로 발생할 수 있는 피해와 동일한 금액입니다.

답변3

제안 사항을 따라야 하는 경우 설정할 몇 가지 변수는 다음과 같습니다.

_git_user='git-user'
_git_group='git-devs'
_git_home_base="/srv/${_git_group}"
_client_certs_root='/home/admin/client-certs'

... 서버 관리자 계정의 관점에서 작성됩니다.


  1. 사용자 'git-server'를 만들었습니다.

우연히 잠그고 시스템 계정으로 만들었나요?

sudo adduser\
 --system\
 --disabled-password\
 --gecos ''\
 --shell "$(which git-shell)"\
 --home "${_git_home_base,,}/${_git_user,,}"\
 --ingroup "${_git_group}"\
 "${_git_user}"

$(which git-shell)파일 경로로 확인되지만 --shell옵션에서 오류가 발생하면...

if [ -e "$(which git-shell)" ] && ! grep -q -- "$(which git-shell)" /etc/shells; then
    sudo tee -a /etc/shells 1>/dev/null <<<"$(which git-shell)"
fi

... 파일 git-shell에 경로를 추가하는 데 도움이 될 수 있습니다./etc/shells



  1. 설치됨openssh-server
  2. 수정 /etc/ssh/sshd_config추가됨PasswordAuthentication no

비활성화했습니까?rootSSH를 통한 비밀번호 인증?

/etc/ssh/sshd_config도움이 될만한 비트...

permitrootlogin without-password


## Additionally consider locking-down other unneeded features
Match Group git-devs
  AllowTcpForwarding no
  AllowStreamLocalForwarding no
  PermitOpen none

  1. .ssh/authorized_keys내 동료의 공개 사례 에 추가됨

공개 키를 정확히 어디에 추가했습니까?

다음은 세 개의 Git 계정을 설정하기 위한 몇 가지 예제 명령입니다.

declare -a _accounts_keys=(
    ["name-one"]="${_client_certs_root}/${_git_group}/name-one/ssh.pub"
    ["name-two"]="${_client_certs_root}/${_git_group}/name-two/ssh.pub"
    ["name-three"]="${_client_certs_root}/${_git_group}/name-three/ssh.pub"
)



for _name in "${!_accounts_keys[@]}"; do
    sudo su --login "${_name}" --shell /bin/bash <<EOF
mkdir .ssh
tee -a .ssh/authorized_keys 1>/dev/null <<<"$(<"${_accounts_keys[${_name}]}")"
chmod 600 .ssh/authorized_keys
EOF
done

내 시스템에서 'git-server' 사용자는 안전한가요? 'git-server'가 'git-server'라는 사실을 전제로 범죄자가 'git-server'에 액세스할 경우 시스템에 대한 최악의 시나리오는 무엇입니까?sudoer

아니요. 모든 사람의 키를 동일한 계정에 추가했고 해당 계정이 라면 sudoer,악몽의 연료나는 이 상황을 거의 무제한으로 처리할 수 있습니다...


git 명령과 별도로 모든 작업을 'git-server'로 금지하려면 어떻게 해야 합니까?

git-shell-commands/no-interactive-login각 Git 계정에 스크립트 추가 ...

for _name in "${!_accounts_keys[@]}"; do
    sudo su --login "${_name}" --shell /bin/bash <<EOC
tee 'git-shell-commands/no-interactive-login' 1>/dev/null <<'EOF'
#!/usr/bin/env bash
printf 'Hi %s, you have successfully authenticated!\n' "${USER}"
printf 'However, there is not an interactive shell here.\n'
exit 128
EOF

chmod u+x 'git-shell-commands/no-interactive-login'
EOC
done

... 디렉토리 내에 다른 실행 파일이 없는 한 git-shell-command계정은 비대화형 git 명령으로 제한됩니다. 단, 계정의 셸도 올바르게 설정되어 있어야 합니다.


위의 내용은 가장 안전하지는 않지만 편리함과 균형을 이루고 있습니다.

  • git-devs그룹은 교차 복제를 원하지 않는 경우 각 계정마다 달라야 합니다. 예를 들어 서버 측의 구조를 알고 있는 경우 name-one(기본 그룹이 계정 간에 공유되는 경우) 가능합니다 .git clone name-two@server:/srv/git-devs/name-two/project-name

600개별 계정 내에서 프로젝트별로 비활성화할 수 있는 권한 과 660공유 그룹 pushpull저장소에 대한 권한을 활성화할 수 있는 권한이 있다면... 개인적으로 640저는최상의git push -f이를 통해 그룹은 다른 계정에서 이탈하여 문제가 발생할 염려 없이 서로 코드를 공유할 수 있습니다 .

  • 다른 git-shell-commands스크립트의 예를 보려면git-utilities/git-shell-commands위의 팁을 적용한 저장소입니다.편의성을 더욱 중요하게 생각합니다.

요컨대~하지 않다클라이언트가 시도하지 않을 것이라고 믿을 수 없다면 위의 링크된 스크립트를 추가하세요.팝아쉘왜냐하면 그러한 것들은 다음과 같이 설계되었기 때문입니다.필요대화형 쉘의 경우 널리 사용되지 않습니다.

보너스 포인트

  • man --pager='less -p "ChrootDirectory"' sshd_configSSH 서버를 더욱 안전하게 보호하기 위해 수행할 수 있는 작업에 대한 힌트를 확인하세요.

  • 관련 문서를 확인 man git-shell하고 확인하세요. man git-daemon사물을 잠그거나 서버와의 통신을 좀 더 쉽게 만드는 데 유용한 몇 가지 옵션이 있습니다. --strict-paths, --base-path=<path>--listen=<host_or_ipaddr>더 자세히 살펴볼 가치가 있을 수 있습니다.


위의 내용에 대해 의심스러운 점이 있으면 이 답변이 개선될 수 있도록 의견을 제시하는 것이 좋습니다.

관련 정보