jenkins에서 git을 사용하기 위해서는 git을 공개키 기반 ssh로 접속해서 사용해야 한다고 한다. 기존에는 git을 http로 사용하거나 ssh로 사용하더라도 아이디, 패스워드 방식으로 사용하였는데, 이번에 공개키 기반 ssh를 설정하기 위해 삽질한 내용을 정리해 보았다.
클라이언트 환경은 윈도우, 서버 환경은 리눅스이다.
내 환경은 윈도우이며, git이 설치되어 있다. 여기에 따르면, 윈도우에 git 설치시에 ssh-keygen이 함께 설치된다 한다.
cmd를 열고 ssh-keygen 명령어로 공개키와 비밀키 각각을 생성한다.
> ssh-keygen -t rsa
이후 나오는 입력값은 다음과 같다.
엔터를 누르면 기본값으로 들어간다. 경로는 따로 변경할 필요를 못 느꼈고, jenkins상에서 사용해야 했기에 passphrase를 넣으면 안되어 기본값으로 사용했다.
기본값으로 사용하면 자신의 홈 디렉토리 밑에 .ssh 폴더 밑에 id_rsa와 id_rsa.pub 파일이 생성되며, 각각 비밀키와 공개키이다. 기본적으로, 이름 그대로 공개키는 공개, 비밀키는 비밀로 자신만 갖고 있어야 된다. (나의 경우 C:\Users\hkpark\.ssh에 생성되었다.)
나는 ssh-keygen을 사용했지만, 그 외에도 puttygen을 사용해도 될 것 같다.
이제 사용할 리눅스 서버에 키를 넣어줘야 된다. 우선 기존 아이디/비밀번호 방식으로 서버에 ssh 접속해준다. (여기서는 hygoogi라는 유저이름으로 접속, 보안을 생각해서 가능한 한 root 접속은 안하도록 하자)
이후 홈 디렉토리 밑에 .ssh 디렉토리를 생성하고, authorized_keys 라는 파일을 만든다. 서버의 sshd에서는 키 기반 접속시 authorized_keys 혹은 authorized_keys2 파일에 들어있는 공개키를 사용해 인증하게 된다.
# mkdir ~/.ssh
# touch ~/.ssh/authorized_keys
# chmod 755 ~/.ssh/authorized_keys
그리고 앞에서 생성한 공개키 파일(id_rsa.pub)의 내용을 authorized_keys파일에 append 한다. scp를 사용해도 되고, ftp를 사용해도 되지만, 개인적으로는 그냥 vi로 붙여넣기 하는게 편했다..
# vi ~/.ssh/authorized_keys
이걸 끝냈다면 나의 경우 /home/hygoogi/.ssh/authorized_keys 라는 파일이 생성되어야 한다.
이제 윈도우로 돌아와서, ssh 접속을 시도하면 비밀번호를 묻지 않아야 성공한 것이다. ssh 접속시 따로 경로를 지정하지 않으면 기본 경로에 있는 ssh 비밀키 파일을 찾아 접속에 사용할 것이다.
그런데 나의 경우, 키를 생성하여 사용했음에도 불구하고 비밀번호를 계속 요구하였다. 즉, 키 사용이 제대로 되지 않은 것.
> ssh hygoogi@my-server-ip -v
-v 옵션을 줘서 디버깅해보니, 키를 읽어옴에는 이상이 없었다. 그 외에 딱히 눈에 띄는 에러 메세지가 보이지 않는 상황.
구글링을 계속 해보던 중, 서버쪽에서도 디버깅 모드로 따로 ssh 데몬을 돌릴 수 있다는 사실을 알게 되었다.
# sudo /bin/sshd -d -p 1234
서버 쪽에서 위 명령으를 사용하면 디버그 모드로 1234번 포트에서 ssh 접속을 허용하게 된다. 1234번 포트로 접속하자 서버 측 콘솔에서 문제점이 바로 보였다.
Authentication refused: bad ownership or modes for file /homes/hygoogi/.ssh/authorized_keys
바로 authorized_keys 파일을 권한 문제로 제대로 읽지 못한 것이었다.
... 근데 아까 권한 줬는데?
위에서 chmod 명령어로 분명 읽기권한 다 줬을텐데.. 참 이상했다. bad ownership이라는 단어가 포함되어 있는걸 보니, 소유권이 다르면 아예 안되는건가 싶기도 한데, 그게 아니라면 아마 회사에서 사용하는 Synology NAS가 다른 리눅스와는 조금 다른 시스템이라서 그런 것이라고 추측하고 있다. (정확한 원인 파악 불가.. 혹시 짐작가시는 이유 있으신 분들은 댓글 남겨주세요.)
그래서 좀 더 삽질을 해보니, ssh 설정 파일에서 StrictModes 를 no로 바꿔주라는 말이 있었다.
# vi /etc/ssh/sshd_config
StrictModes no
# 이 두 가지는 경우에 따라서 default가 아닐 수 있으므로, 주석이 되어있다면 해제
RSAAuthentication yes
PubkeyAuthentication yes
StrictModes는 yes로 세팅되어 있을 때, ssh 데몬이 로그인을 허용하기에 앞서 파일 모드 및 사용자 홈 디렉토리 소유권과 원격 호스트의 파일들을 체크하도록 한다는데, 아마 로그인하는 사용자와 authorized_keys 소유자가 일치해야 로그인을 허용시켜주지 않는건가 추측하고 있다. (역시 이것도 정확히 하시는 분 있으시면 댓글 바랍니다.)
이런 보안 관련된 설정을 끄는것이 찝찝하기도 하지만, 어짜피 회사 로컬 서버라 외부로 나가는 연결은 없어 no로 설정했다.
이제 비밀번호 없이도 비밀키 파일로 SSH 접속 가능하다! 남은건 Jenkins에 Credentials 등록하고 git을 연동하는 작업만 남았다.
서버 측에서도 디버그 모드로 ssh 데몬을 돌릴 수 있다는 것을 알게 되었다.
# sudo /bin/sshd -d -p 1234
앞으로 ssh 관련 이슈가 있을 때 유용할 것 같다.
대표이미지 출처 : https://blackwind.dgist.ac.kr/blog/4-ssh/
안녕하세요 덕분에 테스트로 만든 가상머신 서버에 키등록을 무사히 끝냈습니다 저같은 경우는 윈도우에서 git bash로 ssh-keygen 후에 ssh-copy-id user@ip 명령어로 키전달을 했더니 무난하게 진행된거같습니다 리눅스 서버가 뭐냐에따라 이게 안될 수도 있겠습니다만 참고하시기 바라며 다음에도 좋은 글 부탁드립니다 감사합니다!
잘 읽었습니다.
혹시 대표 이미지는 직접 만드신건가요??