SSH 키 자동 업데이트하기

!
경고: 이 글이 작성된 지 365일이 넘었습니다. 글의 정보가 오래되어 부정확할 수 있습니다.

새로 산 컴퓨터에 개발툴 설치하느라 하루 다 버린 다음에, 정작 개발할 때 SSH로 서버에서 하는 머저리 있습니다. 네, 바로 접니다. 근데, SSH 구동을 하니 여태까지 한 번도 물어보지 않았던 비밀번호를 물어봅니다. 아, SSH 키를 가져오는 것을 깜빡했습니다. 거기에다가 어떤 서버는 키가 없다면 접속도 막아버립니다. 하루는 다 날리고 개발은 하나도 못 하고. 생산성이 이렇게 바닥이니 면접에서 다 떨어지고 취직도 못 하고 집에서 멍청이 소리 듣고… 아니라고요?

이런 참사를 막기 위해서 한 번 접속하면 영원히 접속할 수 있도록 SSH 키를 업데이트해주는 스크립트를 설치해 보겠습니다.

1. 깃허브

일단 깃허브에 접속해서 보안 설정이 완벽하게 설정되어 있는지 확인합니다. 만약 깃허브가 뚫리면 이 스크립트가 설치된 서버들 역시 뚫리게 됩니다.

깃허브 계정의 비밀번호를 변경하고 2FA를 활성화합니다.

이제 Settings > SSH and GPG keys 아래에 새로운 SSH 키들을 모두 추가해줍니다. 만약, 나중에 새로운 SSH 키를 만든다면, 여기에 추가하면 스크립트에서 자동으로 불러옵니다.

키 추가를 다 하셨다면 이제 연결할 서버로 이동합니다.

2. 스크립트

스크립트를 설치할 서버에 연결 후, update-ssh.sh라는 스크립트를 만들어 다음을 붙여넣습니다:

#!/bin/bash

echo -e "$(date)에 스크립트 시작"

curl "https://github.com/여기에-깃허브-아이디.keys" > ~/.ssh/authorized_keys


echo "다음 키가 추가되었습니다:"
cat ~/.ssh/authorized_keys

chmod 600 ~/.ssh/authorized_keys

깃허브 아이디를 스크립트에 편집해넣은 다음, 저장합니다. 예를 들어 제 공개 키들은 다 https://github.com/ericswpark.keys에 나와 있습니다.

이 스크립트를 실행하면 깃허브 프로필의 모든 공개 키를 끌어온 다음 ~/.ssh 폴더 안 authorized_keys 파일에 저장합니다. 그 다음, 적절한 권한을 설정해 SSH 데몬이 파일을 읽을 수 있도록 합니다.

스크립트에 실행 가능 비트를 추가하고 (chmod +x update-ssh.sh) 실행합니다. 이제 새로운 키로 로그인을 시도하면 정상적으로 인식이 됩니다.

하지만 이건 매번 이렇게 실행해야 변경이 되니, 자동으로 끌어오도록 변경해보도록 하겠습니다.

3. 자동화

주기적으로 스크립트를 실행하려면 crontab을 사용합니다.

crontab 사용법을 모르신다고요? 그럼 빨리 짚고 넘어갑니다. 일반적인 crontab 문법은 다음과 같습니다:

20 * * * * ls

첫 번째 열은 분 단위(0~59)고, 두 번째 열은 시간 단위(0~23)입니다. 셋째 열은 월일 단위(1~31)이고, 넷째 열은 월 단워(1~12)이고, 마지막 열은 주일입니다(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분마다 불러오면 안되나요?

깃허브의 서버나 접속하는 서버에 필요없는 부하를 줄이기 위해서입니다. SSH 키를 그렇게 자주 바꾸는 것도 아니지만, 너무 느리면 그냥 수동으로 하는게 더 편리하기에 한 시간이 그나마 적당합니다. 더 작은 주기로 설정할 수 있지만 깃허브에서 접속 제한을 걸 수도 있습니다.

로그를 남기기 위한 파이프(>)는 꼭 필요하진 않지만 나중에 키 추가 기록에 유용할 수도 있습니다.

결론

이제 SSH 키를 업데이트할 때마다 그냥 깃허브에 추가해두고 한 시간 정도를 기다리면 자동으로 스크립트가 설치되어 있는 모든 서버에 업데이트됩니다!

댓글