SSH를 사용하여 Svnserve 보호
이 섹션에서는 svn+ssh 프로토콜을 사용하도록 Subversion 및 TortoiseSVN을 설정하는 단계별 가이드를 제공합니다. 서버에 로그인하기 위해 이미 인증된 SSH 연결을 사용하고 있다면, 이미 해당 상태이며 Subversion 책에서 더 자세한 내용을 찾을 수 있습니다. SSH를 사용하고 있지 않지만 Subversion 설치를 보호하기 위해 사용하고 싶다면, 이 가이드에서는 모든 Subversion 사용자를 위해 서버에 별도의 SSH 사용자 계정을 만들 필요가 없는 간단한 방법을 제시합니다.
이 구현에서는 모든 Subversion 사용자를 위해 단일 SSH 사용자 계정을 생성하고, 실제 Subversion 사용자를 구분하기 위해 다른 인증 키를 사용합니다.
이 부록에서는 Subversion 도구가 이미 설치되어 있고, 이 설명서의 다른 곳에 자세히 설명된 대로 저장소를 생성했다고 가정합니다. SSH와 함께 사용할 때는 svnserve를 서비스 또는 데몬으로 시작해서는 안 됩니다.
여기 있는 정보의 대부분은 Marc Logemann이 제공한 튜토리얼에서 가져온 것으로, tortoisesvn.net에 보관되어 있습니다. Windows 서버 설정에 대한 추가 정보는 Thorsten Müller가 제공했습니다. 감사합니다!
Maximo Migliari가 만든 비디오 튜토리얼을 시청하여 모든 중요한 단계를 따라 할 수도 있습니다. Vimeo 또는 YouTube에서 시청하세요.
Linux 서버 설정
서버에 SSH가 활성화되어 있어야 하며, 여기서는 OpenSSH를 사용할 것이라고 가정합니다. 대부분의 배포판에서는 이미 설치되어 있을 것입니다. 확인하려면 다음을 입력하여 ssh 작업을 찾아보세요.
ps xa | grep sshd
한 가지 유의할 점은 Subversion을 소스에서 빌드하고 ./configure에 인수를 제공하지 않으면, Subversion은 /usr/local 아래에 bin 디렉토리를 생성하고 거기에 바이너리를 배치한다는 것입니다. SSH와 함께 터널링 모드를 사용하려면, SSH를 통해 로그인하는 사용자가 svnserve 프로그램과 다른 바이너리를 실행해야 한다는 것을 알아야 합니다. 이러한 이유로, /usr/local/bin을 PATH 변수에 추가하거나 바이너리의 심볼릭 링크를 /usr/sbin 디렉토리 또는 일반적으로 PATH에 있는 다른 디렉토리에 생성하십시오.
모든 것이 정상인지 확인하려면, SSH를 사용하여 대상 사용자로 로그인하고 다음을 입력하여 svnserve에 도달할 수 있는지 테스트하세요.
which svnserve
svn 저장소에 접근하는 데 사용할 새 사용자를 생성합니다.
useradd -m svnuser
이 사용자에게 저장소에 대한 전체 접근 권한을 부여하십시오.
Windows 서버 설정
Cygwin SSH 데몬을 설치하거나, Windows 10 SSH 도구를 사용하십시오.
저장소에 접근하는 데 사용할 새 Windows 사용자 계정 svnuser를 생성하십시오. 이 사용자에게 저장소에 대한 전체 접근 권한을 부여하십시오.
아직 암호 파일이 없다면 Cygwin 콘솔에서 다음을 사용하여 생성하십시오.
mkpasswd -l > /etc/passwd
TortoiseSVN과 함께 사용할 SSH 클라이언트 도구
Windows 클라이언트에서 SSH를 사용하는 데 필요한 도구를 PuTTY 사이트에서 다운로드하십시오. 다운로드 섹션으로 이동하여 Putty, Plink, Pageant, 그리고 Puttygen을 받으세요.
OpenSSH 인증서 생성
다음 단계는 인증을 위한 키 쌍을 생성하는 것입니다. 키를 생성하는 두 가지 가능한 방법이 있습니다. 첫 번째는 클라이언트에서 PuTTYgen으로 키를 생성하고, 공개 키를 서버에 업로드한 다음 PuTTY로 개인 키를 사용하는 것입니다. 다른 방법은 OpenSSH 도구인 ssh-keygen으로 키 쌍을 생성하고, 개인 키를 클라이언트에 다운로드한 다음 개인 키를 PuTTY 스타일 개인 키로 변환하는 것입니다.
ssh-keygen을 사용하여 키 생성
root 또는 svnuser로 서버에 로그인하고 다음을 입력하세요.
ssh-keygen -b 1024 -t dsa -N passphrase -f keyfile
실제 암호 구문(자신만 아는)과 키 파일을 대체하여 사용합니다. 우리는 방금 1024비트 키 구문을 가진 SSH2 DSA 키를 생성했습니다. 다음을 입력하면,
ls -l keyfile*
keyfile과 keyfile.pub 두 개의 파일이 보일 것입니다. 짐작하겠지만, .pub 파일은 공개 키 파일이고, 다른 하나는 개인 키 파일입니다.
svnuser 홈 디렉토리 내의 .ssh 폴더에 공개 키를 추가하십시오.
cat keyfile.pub >> /home/svnuser/.ssh/authorized_keys.
우리가 생성한 개인 키를 사용하려면 PuTTY 형식으로 변환해야 합니다. 이는 개인 키 파일 형식이 표준 기관에 의해 지정되지 않았기 때문입니다. 개인 키 파일을 클라이언트 PC로 다운로드한 후 PuTTYgen을 시작하고 Conversions -> Import key를 사용하십시오. 서버에서 얻은 파일 keyfile을 찾아보고 키를 생성할 때 사용한 암호 구문을 입력하십시오. 마지막으로 Save private key를 클릭하고 파일을 keyfile.PPK로 저장하십시오.
PuTTYgen을 사용하여 키 생성
PuTTYgen을 사용하여 공개 키/개인 키 쌍을 생성하고 저장하십시오. 공개 키를 서버로 복사하고 svnuser 홈 디렉토리 내의 .ssh 폴더에 추가하십시오.
cat keyfile.pub >> /home/svnuser/.ssh/authorized_keys
PuTTY를 사용하여 테스트
연결을 테스트하기 위해 PuTTY를 사용할 것입니다. 프로그램을 시작하고 Session 탭에서 호스트 이름을 서버의 이름 또는 IP 주소로 설정하고, 프로토콜을 SSH로 설정한 다음 세션을 SvnConnection 또는 원하는 이름으로 저장하십시오. SSH 탭에서 선호하는 SSH 프로토콜 버전을 2로 설정하고 Auth에서 이전에 변환한 .PPK 개인 키 파일의 전체 경로를 설정하십시오. Sessions 탭으로 돌아가서 Save 버튼을 누르십시오. 이제 저장된 세션 목록에 SvnConnection이 보일 것입니다.
Open을 클릭하면 텔넷 스타일 로그인 프롬프트가 표시될 것입니다. 사용자 이름으로 svnuser를 사용하면 모든 것이 잘 되면 암호를 묻는 메시지 없이 직접 연결될 것입니다.
서버에서 /etc/sshd_config를 편집해야 할 수도 있습니다. 다음 지침에 따라 줄을 편집하고 SSH 서비스를 재시작하십시오.
PubkeyAuthentication yes PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no
TortoiseSVN으로 SSH 테스트
지금까지는 SSH를 사용하여 로그인할 수 있는지 테스트했습니다. 이제 SSH 연결이 실제로 svnserve를 실행할 수 있는지 확인해야 합니다. 서버에서 /home/svnuser/.ssh/authorized_keys를 다음과 같이 수정하여 여러 Subversion 작성자가 동일한 시스템 계정 svnuser를 사용할 수 있도록 하십시오. 각 Subversion 작성자는 동일한 로그인을 사용하지만 다른 인증 키를 사용하므로, 각 작성자에 대해 한 줄을 추가해야 합니다. 참고: 이 모든 내용은 한 줄로 매우 길게 작성됩니다.
command="svnserve -t -r <ReposRootPath> --tunnel-user=<author>",
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,
no-pty ssh-rsa <PublicKey> <Comment>설정에 따라 몇 가지 값을 설정해야 합니다.
<ReposRootPath>는 저장소가 포함된 디렉토리의 경로로 대체해야 합니다. 이렇게 하면 URL 내에서 전체 서버 경로를 지정할 필요가 없습니다. Windows 서버에서도 슬래시(/)를 사용해야 한다는 점에 유의하십시오(예: c:/svn/reposroot). 아래 예시에서는 저장소 루트 내에 repos라는 저장소 폴더가 있다고 가정합니다.
<author>는 커밋 시 저장하고자 하는 svn 작성자로 대체되어야 합니다. 이는 또한 svnserve가 svnserve.conf 내에서 자체 접근 권한을 사용하도록 허용합니다.
<PublicKey>는 이전에 생성한 공개 키로 대체되어야 합니다.
<Comment>는 원하는 어떤 주석이라도 될 수 있지만, svn 작성자 이름을 실제 사람 이름에 매핑하는 데 유용합니다.
Windows 탐색기에서 아무 폴더나 마우스 오른쪽 버튼으로 클릭하고 TortoiseSVN -> 저장소 브라우저를 선택하십시오. URL을 입력하라는 메시지가 나타나면 다음 형식으로 입력하십시오.
svn+ssh://svnuser@SvnConnection/repos
이 URL은 무엇을 의미합니까? 스키마 이름은 svn+ssh로, TortoiseSVN이 서버 요청을 처리하는 방법을 알려줍니다. 이중 슬래시 다음에는 서버에 연결할 사용자(이 경우 svnuser)를 지정합니다. @ 다음에는 PuTTY 세션 이름을 제공합니다. 이 세션 이름에는 개인 키를 찾을 위치 및 서버의 IP 또는 DNS와 같은 모든 세부 정보가 포함됩니다. 마지막으로, authorized_keys 파일에 지정된 대로 서버의 저장소 루트를 기준으로 저장소 경로를 제공해야 합니다.
확인을 클릭하면 저장소 내용을 탐색할 수 있어야 합니다. 그렇다면 이제 TortoiseSVN과 함께 작동하는 SSH 터널이 설정된 것입니다.
기본적으로 TortoiseSVN은 자체 버전의 Plink를 사용하여 연결한다는 점에 유의하십시오. 이는 모든 인증 시도 시 콘솔 창이 나타나는 것을 방지하지만, 오류 메시지가 나타날 곳이 없다는 의미이기도 합니다. 표준 출력에 쓸 수 없습니다
라는 오류를 수신하는 경우, TortoiseSVN의 네트워크 설정에서 Plink를 클라이언트로 지정해 볼 수 있습니다. 이렇게 하면 Plink에서 생성된 실제 오류 메시지를 볼 수 있습니다.
SSH 구성 변형
TortoiseSVN에서 URL을 간소화하는 한 가지 방법은 PuTTY 세션 내에서 사용자를 설정하는 것입니다. 이를 위해 PuTTY에서 이미 정의된 세션 SvnConnection을 로드하고 연결 탭에서 자동 로그인 사용자를 사용자 이름(예: svnuser)으로 설정해야 합니다. 이전과 같이 PuTTY 세션을 저장하고 TortoiseSVN 내에서 다음 URL을 시도하십시오.
svn+ssh://SvnConnection/repos
이번에는 SSH 클라이언트 TortoiseSVN이 사용하는 PuTTY 세션 SvnConnection만 제공합니다(TortoisePlink.exe). 이 클라이언트는 모든 필요한 세부 정보를 세션에서 확인할 것입니다.
이 글을 쓰는 시점에서 PuTTY는 모든 저장된 구성을 확인하지 않으므로, 동일한 서버 이름을 가진 여러 구성이 있는 경우 일치하는 첫 번째 구성을 선택합니다. 또한 기본 구성을 편집하고 저장하더라도 자동 로그인 사용자 이름은 저장되지 않습니다.
많은 사람들이 모든 키를 저장하기 위해 Pageant를 사용하는 것을 선호합니다. PuTTY 세션이 키를 저장할 수 있으므로 항상 Pageant가 필요한 것은 아닙니다. 하지만 여러 다른 서버에 대한 키를 저장하고 싶다고 상상해 보십시오. 이 경우 연결하려는 서버에 따라 PuTTY 세션을 계속해서 편집해야 할 것입니다. 이러한 상황에서 Pageant는 완벽한 의미를 가집니다. PuTTY, Plink, TortoisePlink 또는 다른 PuTTY 기반 도구가 SSH 서버에 연결하려고 할 때, Pageant가 보유한 모든 개인 키를 확인하여 연결을 시작하기 때문입니다.
이 작업을 위해 Pageant를 실행하고 개인 키를 추가하십시오. 이는 위 PuTTY 세션에서 정의한 것과 동일한 개인 키여야 합니다. 개인 키 저장을 위해 Pageant를 사용하는 경우, 저장된 PuTTY 세션의 개인 키 파일에 대한 참조를 삭제할 수 있습니다. 물론 다른 서버 또는 다른 사용자를 위한 키를 더 추가할 수 있습니다.
클라이언트를 재부팅할 때마다 이 절차를 반복하고 싶지 않다면, Pageant를 Windows 설치의 자동 시작 그룹에 두어야 합니다. Pageant.exe에 명령줄 인수로 완전한 경로와 함께 키를 추가할 수 있습니다.
SSH 서버에 연결하는 마지막 방법은 TortoiseSVN 내에서 이 URL을 사용하는 것입니다.
svn+ssh://[email protected]/repos svn+ssh://[email protected]/repos
보시다시피, 저장된 PuTTY 세션을 사용하지 않고 IP 주소(또는 도메인 이름)를 연결 대상으로 사용합니다. 사용자도 제공하지만, 개인 키 파일이 어떻게 찾아지는지 궁금할 수 있습니다. TortoisePlink.exe는 PuTTY 스위트의 표준 Plink 도구의 수정된 버전이므로, TortoiseSVN은 Pageant에 저장된 모든 키를 시도할 것입니다.
이 마지막 방법을 사용하는 경우, PuTTY에 기본 사용자 이름이 설정되어 있지 않은지 확인하십시오. PuTTY에 버그가 있어 이 경우 연결이 끊어지는 보고가 있었습니다. 기본 사용자를 제거하려면 HKEY_CURRENT_USER\Software\SimonTatham\Putty\Sessions\Default%20Settings\HostName을 지우기만 하면 됩니다.