[번역]레일스 5.2에서 사용하는 레일스 암호화인증서(Encrypted Credentials)

저자 : 크리스토퍼 리고

원문 : https://www.engineyard.com/blog/rails-encrypted-credentials-on-rails-5.2

기고일 : 2017년 12월 15일

레일스 5.1에서는 암호화 보안키(encrypted secrets)를 도입하여 secrets.ymlsecrets.yml.enc 두 개의 파일에 두도록 했다. 이것은 일반 보안키를 사용해야 할지 암호화 보안키를 사용할지 혼란을 초래하기도 한다.

그래서 레일스 5.2에서는 이 두개의 보안키를 하나의 암호화 인증서로 대체해 버렸다. 따라서 일반 인증서는 사용할 수 없도록 했다. 즉, credentials.yml.enc 파일 하나만 존재 한다.

암호화 인증서(Encrypted Credentials)

암호화 인증서를 사용하기 위해서 하나의 키가 필요하다. 암호화용 키가 없다면 인증서의 암호화 코드를 해독할 수 없게 된다. 따라서, 암호화 인증서는 저장소로 커밋하고 암호화용 키는 절대로 저장소에 커밋해서는 안 된다.

암호화용 키는 rails new 명령을 실행할 때 config/master.key 파일에 생성되며 이 파일은 .gitignore 에 추가되어 저장소로 저장되지 않게 된다.

한편 암호화 인증서는 config/credentials.yml.enc 파일에 저장된다. 이 파일은 직접 변경해서는 안된다. 대신에 인증서를 추가하기 위해서는 다음과 같은 명령을 실행한다.

$ bin/rails credentials:edit

암호화되지 않은 일반 인증서가 텍스트 에디터 상에 보이게 될 것이다. EDITOR 환경 변수가 지정되어 있지 않다면 EDITOR=vi bin/rails credentials:edit 명령을 실행하거나 vi 이 외의 선호하는 에디터로 대신할 수 있다.

파일을 저장하게 되면 암호화 버전의 인증서가 config/credentials.yml.enc 파일로 저장될 것이다.

인증서 해독하기

배포 환경에서 인증서를 사용하기 위해서는 config/environments/production.rb 파일에 다음의 코드라인을 추가한다.

config.require_master_key = true

Rails.application.credentials 값을 호출하면 인증서 내용을 볼 수 있게 된다. 예를 들어 인증서에 다음의 내용이 있다고 가정할 때

foo: bar

Rails.application.credentials.foo 는 bar 값을 반환할 것이다.

인증서 양식

인증서는 YAML 문법으로 작성하면 된다. 또한 더 이상 developmentproduction 키를 표시할 필요는 없다.

aws:
  access_key_id: 123
  secret_access_key: 345

이제 Rails.application.credentials.aws[:access_key_id]Rails.application.credentials.aws[:secret_access_key] 와 같이 호출하여 해당 키 값을 사용할 수 있게 된다.

그러나 production 키를 사용할 수 없는 것은 아니다. 다음과 같이 사용할 수도 있다.

production:
  aws:
    access_key_id: 123
    secret_access_key: 345

이 경우에는 Rails.application.credentials.production[:aws][:access_key_id]Rails.application.credentials.production[:aws][:secret_access_key] 와 같이 사용할 수 있게 된다.

암호화 인증서를 사용하여 얻을 수 있는 장점들

  1. 인증서가 암호화되어 있다. 따라서 암호화시 사용한 키를 없다면 인증서를 해독할 수 없다.
  2. 암호화된 인증서는 저장소에 커밋되기 때문에 인증서에 대한 변경된 내역이나 변경한 사람 목록을 알 수 있다.
  3. 코드와 함께 사용할 인증서를 추가로 배포할 수 있다. 예를 들어 어떤 API를 사용하기 위해 코드를 추가할 경우 credentails.yml.enc 파일에 토큰과 함께 코드를 배포할 수 있다.
  4. 모든 보안키를 하나의 장소에 둘 수 있다. 여러 개의 환경변수를 각각 관리하지 않고 하나의 파일로 합쳐서 관리하게 된다.

마스터 키 관리하기

암호화 인증서를 사용하게 되면 암호화되지 않은 보안키를 사용할 때 보다 많은 장점을 제공해 주는데, 암호화에 사용하는 마스트 키를 적당한 곳에 두어야 한다. 여기서 언급하는 몇가지 옵션은 레일스 5.1 이전 버전에서 사용하는 보안키 처리 방식과 비슷하다. 저장소 소스 코드에 접근할 수 있는 모든 사람이 암호화 인증서를 해독할 수 있기 때문에 마스터 키는 저장소로 커밋해서는 안되다.

  1. master.key 파일을 보안 상태로 업로드하기

    scp 또는 sftp로 이 파일을 서버로 복사하거나 업로드할 수 있다. Engine Yard 에서는 한번만 이 과정을 하면 된다. 이 후 서버 환경을 확장할 경우 새로 추가되는 서버는 자동으로 master.key 파일의 복사본을 가지게 된다.

    마스터 키는 공유 디렉토리로 업로드해 둔다. 여기서의 공유 디렉토리는 공유 파일시스템이 아니고 여러 차례에 걸쳐 서버로 배포 과정이 진행되더라도 변경되지 않고 그대로 유지되는 디렉토리를 의미한다. 방법은 배포시마다 config/master.key 파일을 /path/to/shared/config/masterkeysymlink를 걸어준다. Engine YardCapistrano 를 사용시 배포 훜(deploy hook)에 이러한 작업을 삽입해 둘 수 있다.

    마스터 키 파일을 동료 개발자에서 복사해 줘야 할 경우에는 이메일을 암호화해서 보내지 않는 한 절대로 이메일로 보내면 안 된다. 대신에 암호화를 사용하는 비밀번호 관리 툴을 사용할 수 있다.

  2. 마스터 키 값을 RAILS_MASTER_KEY 환경변수로 지정하기

    서버로 파일을 업로드할 수 없을 상황에서는 이 방법이 유일한 옵션이다. 이 방법은 편리할 대신 환경변수를 사용할 때의 문제점을 확인해 알아 둘 필요가 있다. 이러한 문제점을 해결할 수 있는 여지가 있긴 하지만, master.key 파일을 업로드할 수 상황이 된다면 가능한한 이 옵션을 선택하기 바란다.

암호화용 보안키(Secret Key Base)와의 차이점

인증서(credentials)를 암호화하기 위해서 사용하는 마스터 키(master key)는 암호화용 보안키(secret key base)와 다른 것이다. master.key 파일 상의 키는 모든 인증서를 암호화하고 해독하는데 사용한다. 따라서 이 키를 암호화용 보안키(secret key base)로 대용할 수 없다.

암호화용 보안키는 레일스 작동시에 필요한다. (역자 주: 즉, 세션을 생성할 때 세션 값을 암호화하는 사용한다.) 이 보안키를 새로 생성할 필요가 있을 때는 우선 다음과 같이 실행하여 새로운 보안키를 생성한 후

$ bin/rails secret

다음의 명령을 실행한 후 이 값을 인증서에 추가하면 된다.

$ bin/rails credentials:edit

 

결론

암호화 인증서는 비암호화 인증서나 환경변수보다 몇가지 장점을 제공해 준다. 과거에 수없이 그랬던 것처럼 레일스는 늘 복잡한 것을 간단하게 만들어 주었다. 암호화 인증서 기능을 사용해 보고 개선할 사항을 코멘트로 알려 주기 바란다.

Posted in 미분류. Bookmark the permalink.