SSH 키 자동 업데이트하기
새로 산 컴퓨터에 개발툴 설치하느라 하루 다 버린 다음에, 정작 개발할 때 SSH로 서버에서 하는 머저리 있습니다. 네, 바로 접니다. 근데, SSH 구동을 하니 여태까지 한 번도 물어보지 않았던 비밀번호를 물어봅니다. 아, SSH 키를 가져오는 것을 깜빡했습니다. 거기에다가 어떤 서버는 키가 없다면 접속도 막아버립니다. 하루는 다 날리고 개발은 하나도 못 하고. 생산성이 이렇게 바닥이니 면접에서 다 떨어지고 취직도 못 하고 집에서 멍청이 소리 듣고… 아니라고요?
이런 참사를 막기 위해서 한 번 접속하면 영원히 접속할 수 있도록 SSH 키를 업데이트해주는 스크립트를 설치해 보겠습니다.
1. GitHub
일단 GitHub에 접속해서 보안 설정이 완벽하게 설정되어 있는지 확인합니다. 만약 GitHub가 뚫리면 이 스크립트가 설치된 서버들 역시 뚫리게 됩니다.
따라서 GitHub 계정의 비밀번호를 변경하고 2FA를 활성화합니다.
이제 Settings > SSH and GPG keys 아래에 새로운 SSH 키들을 모두 추가해줍니다. 만약, 나중에 새로운 SSH 키를 만든다면, 여기에 추가하면 스크립트에서 자동으로 불러옵니다.
키 추가를 다 하셨다면 이제 연결할 서버로 이동합니다.
2. 스크립트
스크립트를 설치할 서버에 연결 후, update-ssh.sh
라는 스크립트를 만들어 다음을 붙여넣습니다:
GitHub 아이디를 스크립트에 편집해넣은 다음, 저장합니다.
이 스크립트를 실행하면 GitHub 프로필의 모든 공개 키를 끌어온 다음 ~/.ssh
폴더 안 authorized_keys
파일에 저장합니다. 그 다음, 적절한 권한을 설정해 SSH 데몬이 파일을 읽을 수 있도록 합니다.
스크립트에 실행 가능 비트를 추가하고 (chmod +x update-ssh.sh
) 실행합니다. 이제 새로운 키로 로그인을 시도하면 정상적으로 인식이 됩니다.
하지만 이건 매번 이렇게 실행해야 변경이 되니, 자동으로 끌어오도록 변경해보도록 하겠습니다.
3. 자동화
주기적으로 스크립트를 실행하려면 crontab
을 사용합니다.
crontab
사용법을 모르신다고요? 그럼 빨리 짚고 넘어갑니다. 일반적인 crontab
문법은 다음과 같습니다:
20 * * * * ls
첫 번째 열은 분 단위(059)고, 두 번째 열은 시간 단위(023)입니다. 셋째 열은 월일 단위(131)이고, 넷째 열은 월 단워(112)이고, 마지막 열은 주일입니다(0은 일요일~6은 토요일). 와일드 카드 부호 (*)는 그 단위의 가능한 모든 값에 부합합니다.
따라서, 위 crontab
줄은 매시각 20분에 실행됩니다 (2시 20분, 3시 20분, 등등).
또 반복 패턴도 있지만 (/2는 2 단위마다, 등등) 모든 리눅스 배포판에서 동작하진 않기에 사용할때 주의해야 합니다!
리눅스 잘 쓰신다면 systemd
도 아실 겁니다. 하지만 제 생각엔 아직 cron
이 더 많이 사용되고 있는 것 같아서 (아닐수도 있습니다), 이 튜토리얼에선 crontab
을 사용합니다.
접속된 서버에서 crontab -e
를 실행합니다. 기본 에디터가 열리면 맨 아래로 내려가 다음을 입력합니다:
42 * * * * ~/update-ssh.sh >> ~/update-ssh.sh.log
숫자 42를 0과 59 사이의 임의의 숫자로 변경해 동시다발적으로 스크립트가 작동하지 않게 해 두 서버의 부하를 줄입니다. 이 crontab
줄은 매 시간 설정된 분 단위에 실행됩니다.
왜 1분마다 불러오면 안되나요?
GitHub의 서버나 접속하는 서버에 필요없는 부하를 줄이기 위해서입니다. SSH 키를 그렇게 자주 바꾸는 것도 아니지만, 너무 느리면 그냥 수동으로 하는게 더 편리하기에 한 시간이 그나마 적당합니다. 더 작은 주기로 설정할 수 있지만 GitHub에서 접속 제한을 걸 수도 있습니다.
로그를 남기기 위한 파이프(>)는 꼭 필요하진 않지만 나중에 키 추가 기록에 유용할 수도 있습니다.
결론
이제 SSH 키를 업데이트할 때마다 그냥 GitHub에 추가해두고 한 시간 정도를 기다리면 자동으로 스크립트가 설치되어 있는 모든 서버에 업데이트됩니다!