github에 circleci를 연동하는 과정에서 겪었던 슬픈 이야기를 조근 조근 읊어보려 한다.
ssh fingerprint 와 known_hosts
ssh는 비대칭키를 사용하는데, 이때 host의 암호키에 대해서 fingerprint를 확인하는 절차를 거친다. ssh가 널리 사용되는 만큼 자주 접할 수 있는 그 질문! "니가 접속하려는 host의 암호키 fingerprint가 이건데, 맞아?" 솔직히 이 fingerprint 진짜 대조해 보는 사람이 있을까 싶지만, 그런 헛점을 이용하면 아이디 / 패스워드 빼먹는 일은 별로 안 어려울 것 같다는 생각도 든다.
어째든, host의 암호키 fingerprint를 확인하는 절차를 거친 후에 ssh 연결이 진행되는데, 확인된 공개키는 ~/.ssh/known_hosts
파일에 기록되어서 다시 확인하는 절차가 생략된다.
CI의 특성상 컨테이너에서 매번 새롭게 접근할 때마다 그 fingerprint를 확인 할 수 없으므로 조치를 취해야 한다.
- fingerprint를 사전에 입력해둔다.
echo {fingerprint} > ~/.ssh/known_host
- 무식해 보이지만 확실한 경우만 예외를 적용한다는 점에서 아랫것들보다 나을 수 있지만, 귀찮다.
- 공개키를 스캔해서 known_hosts 파일에 넣는 사전 절차를 추가한다.
ssh-keyscan -H [host, ip] >> ~/.ssh/known_host
- CI의 특수한 케이스라면 차라리 아랫것을 쓰겠다. 네크워크 리소스 낭비다.
- 공개키 확인 절차를 무시하도록 설정한다.
echo " StrictHostKeyChecking no" >> ~/.ssh/config
docker image 는 root 유저
docker 이미지는 root user로 사용하는 것이 기본이다. home의 위치도 /root
이다. 여기서 기본은 일반적이란 뜻이다. 물론 root가 아닐 수도 있고, home의 위치도 다른 곳으로 설정되어 있을 수 있다. 그럴 경우, 문제가 왕왕 생길 수 있다. 누군가는 그 설정 때문에 당황하게 될 수도 있다.
home은 우리 집이어야 한다
docker 이미지를 생성할 때 root가 아닌 다른 유저를 추가하고, 해당 유저로 실행되도록 설정 할 수 있다. 하지만 그 docker 이미지를 사용하는 시스템이 계정을 변경 할 수도 있다. 계정은 변경되었지만 home의 위치는 변경되지 않았다면? ~/.ssh
이렇게 접근할 때 엉뚱한 곳에 접근하게 된다. 최악이다! circleci 는 docker 설정과 무관하게 root 계정으로 로그인되지만 정작 home의 위치는 따로 조정하지 않아서...고통을...
RUN groupadd -g 999 appuser
RUN useradd -r -u 999 -g appuser appuser
USER appuser
github의 deploy key 와 user key
github에 ssh 연결을 할 때 사용되는 키는 2가지 종류가 있다. deploy key
와 user key
deploy key
는 프로젝트 단위로 설정할 수 있고, user key
는 사용자 계정 단위로 설정이 가능하다. 아주 직관적이다. 다만, 같은 deploy key
를 서로 다른 프로젝트에서 사용할 수가 없다.
circleci와 연동 할 때는 checkout key
설정과 SSH Permissions
설정이 있는데, SSH permissions
에 private key
를 추가해서 사용하는 방식은 github 이외의 시스템에만 적용해라. github는 checkout key
설정으로 해결하는 것을 권한다. circleci에서 키를 관리하므로 간편할 뿐만 아니라 원인 모를 오동작으로부터 보다 자유롭다. 아래 가이드 대로 SSH Permissions
에 다른 repo deploy key
를 설정해서 사용해 보았지만, 제대로 동작하지 않았다. 우선 순위가 있는 건지...checkout key
에서 키를 모두 삭제해야 적용이 되는데, 다 부질없다. 단순한게 짱이다.
GitHub and Bitbucket Integration
github page는 submodule도 된다고 했는데
된다고 해서 야심차게 submodule을 사용해서 repo 간에 느슨한 연결을 구성했지만, 막상 잘 되지 않았다. 물론 enterprise 버전이다. 나에겐 그것을 바로 잡을 오지랖력이 남아있지 않았다. 항상 느끼지만, enterprise가 더 좋아야 할 것 같은데, 안 좋은게 더 많은 것 같다. 고인물은 썩기 마련이지...
교훈
많은 사람이 사용하지 않는 시스템 또는 많은 사람들이 사용하지 않은 기능은 각오가 남달라야 한다. 내가 마루타가 될 확률이 매우 높다. Advanced
기능을 사용하기 전에는 다른 사람들의 경험을 먼저 훑어보자. 좋은 벤치마크 대상은 많을 수록 좋다. 감사한 마음으로 겸손하게, 영리하게 선구자들을 이용하자!
슬픈이야기는
바쁘게 열심히 움직였는데, 결과가 생각만큼 안 나와서 슬펐다. 집에 와서 머리를 감다 생각이 났다. 눈에 보이는 결과는 기대 이하지만, 내가 얻은 것은 생각보다 더 많구나. 삽질을 슬퍼하지 말고, 분노하지 말고, 긍정 알약 하나 먹고, 내일도 화이팅!
'나의 경험담' 카테고리의 다른 글
[T.Viewer 개발일기] 8. PoC 검증 (0) | 2020.07.12 |
---|---|
[T.Viewer 개발일기] 7. 모방은 창조의 어머니 (0) | 2020.07.05 |
[T.Viewer 개발일기] 6. PoC를 먼저 해보자 (0) | 2020.06.27 |
개발자에게 뽀모도로 기법이란? (0) | 2020.01.16 |
[T.Viewer 개발일기] 5. 단위 테스트를 합니다 (0) | 2020.01.08 |
[T.Viewer 개발일기] 4. 개발 일정 정하기 (0) | 2019.11.11 |
[T.Viewer 개발일기] 3. Vue & Vuetify, Webpack (0) | 2019.10.28 |
댓글