Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Travis CI에서 RSA 키 사용하기

Travis CI에서 테스트를 작성하다 보면 공개되면 안 되는 정보를 담아야 하는 경우가 있다. 대표적으로 API 키나 Access Token 등이 있는데 Travis에서는 travis encrypt라는 명령어로 특정 환경 변수를 암호화해서 저장할 수 있게 제공하고 있다. Travis가 개인/공개키를 만들어서 암호화해서 저장한 뒤에 CI에서 테스트를 실행할 때 복호화해서 사용할 수 있게 해준다.

그래서 암호화를 하는 경우 보안 문제로 Pull Request 등에서는 사용할 수 없게 된다. 이 때문에 암호화를 하면 Pull Request에서는 테스트를 제대로 돌릴 수가 없게 되는데 이에 대해서는 이전에 쓴 Travis CI의 환경변수로 실행환경 검사하기에 자세히 설명해 놓았다. 어쨌든 현재 암호화를 한 경우 Pull Request에서 테스트를 실행하지 못하는 문제를 해결할 방법은 현재 없다.

Travis CI에서 암호화된 파일 사용하기

Travis CI에서는 Encrypting Files라는 문서에서 파일을 암호화하는 방법을 설명하고 있다. 파일 암호화도 방법은 앞에서 설명한 문자열 암호화와 같으므로 Pull Request에서는 복호화를 할 수 없다.

먼저 gem install travis로 travis cli를 설치한 후 travis login로 로그인을 한다. Hello World라는 secret.txt 파일이 있다고 한다면 travis encrypt-file로 파일을 암호화할 수 있다.

$ travis encrypt-file secret.txt
encrypting secret.txt for outsideris/travis-test
storing result as secret.txt.enc
storing secure env variables for decryption

Please add the following to your build script (before_install stage in your .travis.yml, for instance):

    openssl aes-256-cbc -K $encrypted_95f9db25c60a_key -iv $encrypted_95f9db25c60a_iv -in secret.txt.enc -out secret.txt -d

Pro Tip: You can add it automatically by running with --add.

Make sure to add secret.txt.enc to the git repository.
Make sure not to add secret.txt to the git repository.
Commit all changes to your .travis.yml.

실행하고 나면 암호화된 secret.txt.enc 파일이 생성된다. 위 안내를 보면 .travis.ymlbefore_install 부분에 openssl aes-256-cbc -K $encrypted_95f9db25c60a_key -iv $encrypted_95f9db25c60a_iv -in secret.txt.enc -out secret.txt -d를 추가해 주라고 나오는데 이 부분이 Travis에서 테스트를 실행할 때 복호화를 해주는 명령어다. --add 옵션을 추가해주면 자동으로 .travis.yml 파일에 위 내용을 넣어준다.

$ travis encrypt-file secret.txt --add
encrypting secret.txt for outsideris/travis-test
storing result as secret.txt.enc
storing secure env variables for decryption

Make sure to add secret.txt.enc to the git repository.
Make sure not to add secret.txt to the git repository.
Commit all changes to your .travis.yml.

이제 수정된 .travis.yml파일과 secret.txt.enc파일을 커밋하면 된다. 이때 암호화되지 않은 secret.txt파일은 절대로 추가하면 안 된다.

Travis 로그에서 암호화된 파일과 복호화한 후의 내용을 출력

이제 Travis에서 파일의 내용을 출력해 보도록 설정해서 확인해 보면 secret.txt.enc는 암호화되어 있지만 openssl aes-256-cbc -K $encrypted_95f9db25c60a_key -iv $encrypted_95f9db25c60a_iv -in secret.txt.enc -out secret.txt -d를 실행한 뒤 만들어진 secret.txt는 원래 입력한 Hello World로 복호화된 것을 볼 수 있다.

Travis CI에서 RSA 키 사용하기

위에서는 단순히 파일을 암호화했지만, 문자열을 암호화하는 대신 파일을 암호화해야 하는 경우는 많지 않다. 대부분은 RSA 키 같은 비밀키를 암호화하는 경우라고 생각된다. 가장 간단한 예로는 GitHub private 저장소에 특정 모듈을 올려두고 공개 저장소에 올리지 않은 채 가져오려고 하는 경우이다. 비공개 모듈이므로 공개 저장소를 이용할 수도 없고 GitHub 저장소를 공개로 바꿀 수 없으므로 SSH 키를 이용해서 가져와야 한다.(private 저장소 등을 사용하는 방법도 있지만, 이 관리도 만만치 않은 일이고 여기도 접속 정보는 필요하다) 이외에도 사내 특정 환경으로 인한 SSH 접속해서 정보를 가져오는 게 테스트 환경에 포함될 수 있다. 아주 흔한 일은 아니지만, 충분히 가능한 일이다.

RSA 비밀키를 Travis에 올리는 것은 위험한 일이지만 Travis에 사용할 목적으로 만든 파일이라고 가정하고 id_rsa파일이 있으면 위의 파일 암호화 과정을 거쳐서 id_rsa.enc파일을 만들고 Travis에서 이 파일을 복호화해서 원래의 id_rsa파일을 생성할 수 있다.

Travis CI는 Circle CI처럼 SSH 접속이 안 돼서 이 부분에서 고생을 한참 했는데 일반적인 Unix 환경처럼 .ssh폴더 아래 적절한 권한으로 만들어서 SSH를 사용할 때 해당 키를 사용하도록 설정하면 된다.

before_install:
  - openssl aes-256-cbc -K $encrypted_95f9db25c60a_key -iv $encrypted_95f9db25c60a_iv -in id_rsa.enc -out id_rsa -d
  - mv id_rsa ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - eval $(ssh-agent -s)
  - ssh-add ~/.ssh/id_rsa

위는 .travis.yml에서 설정한 내용인데 id_rsa파일로 복호화한 뒤 ~/.ssh/id_rsa로 복사해서 권한 설정을 하고 관련 SSH 환경변수를 설정하고 나서 ssh-add로 키를 사용하도록 등록한 것이다.

이제 이후 관련 모듈 설치나 테스트에서 SSH 접속을 할 때 이 비밀키가 필요한 곳이 있을 때 정상적으로 사용할 수 있다.

2016/11/29 10:09 2016/11/29 10:09