시크릿과 Fly Apps
fly secrets 명령을 사용해 Fly App에 시크릿을 지정할 수 있어요. 시크릿은 자격 증명 같은 민감한 값을 앱에 안전하게 전달하기 위한 기능이에요. 이 페이지에서는 시크릿 설정/조회/삭제 방법과 파일로 마운트하는 방법, 그리고 시크릿이 어떻게 보관되고 Machine에 주입되는지 설명해요.
출처: 문서
본문
개요 (Overview)
fly secrets 명령을 사용해 Fly App의 시크릿을 지정할 수 있어요. 시크릿을 사용하면 자격 증명 같은 민감한 값이 Fly App에 안전하게 전달돼요. 시크릿은 암호화되어 볼트(vault)에 저장되어요. 앱의 시크릿은 해당 Fly App에 속한 모든 Machine에서 런타임에 환경 변수로 사용할 수 있어요. Machine이 Fly Launch가 관리하는지 여부와는 상관없어요.
시크릿으로 저장된 데이터가 꼭 민감할 필요는 없어요. 시크릿은 원하는 용도로 사용할 수 있도록 앱에 환경 변수로 제공되기 때문이에요.
Docker 이미지 빌드 시 시크릿이 필요하다면 빌드 시크릿을 참고하세요.
아키텍처 (Architecture)
시크릿은 암호화된 볼트에 저장돼요. flyctl로 시크릿을 설정하면 그 값이 우리 API를 통해 전송되고, API는 특정 Fly App용 볼트에 기록해요. API 서버는 암호화만 할 수 있고 복호화는 할 수 없어요. 시크릿 값이 로그에 기록되는 일은 없어요.
앱용 Machine을 실행할 때 우리는 그 Machine이 실행되는 호스트에 임시 인증 토큰을 발급해요. 호스트의 Fly.io 에이전트는 이 토큰을 사용해 앱 시크릿을 복호화하고, 부팅 시 Machine에 환경 변수로 주입해요. Machine을 파괴하면 호스트 환경은 더 이상 앱 시크릿에 접근할 수 없게 돼요.
경고:
flyctl과 우리 API 서버는 사용자 시크릿이 추출되지 않도록 설계되어 있어요. 하지만 시크릿은 환경 변수로 애플리케이션 코드에서 사용할 수 있어요. 배포 권한이 있는 사람은 시크릿 값을 읽어 로그에 출력하거나 암호화되지 않은 데이터 저장소에 기록하는 코드를 배포할 수 있습니다.
시크릿 다루기
시크릿 설정
fly secrets set 명령은 하나 이상의 앱 시크릿을 설정한 다음, 해당 Fly App에 속한 각 Machine을 업데이트해요. 이 과정에서 Machine이 재시작되고 그에 따라 임시 파일 시스템도 초기화돼요.
다음 예시는 애플리케이션 프로세스 안에서 DATABASE_URL 환경 변수로 사용할 수 있는 시크릿을 설정해요:
fly secrets set DATABASE_URL=postgres://example.com/mydb
앱의 볼트에 시크릿을 설정하거나 업데이트하되, Machine 업데이트는 나중으로 미루고 싶다면 --stage 옵션을 사용하세요. 예를 들어:
fly secrets set DATABASE_URL=postgres://example.com/mydb --stage
위 예시에서 스테이징된(staged) 시크릿은 fly secrets set 명령을 실행한 뒤 시작되거나 업데이트되는 Machine에서만 사용할 수 있어요.
secrets 명령은 stdin에서도 시크릿을 받을 수 있어요. 명령과 옵션에 대한 자세한 내용은 fly secrets 문서 또는 fly secrets --help 실행 결과를 참고하세요.
참고:
fly deploy로 새 릴리스를 트리거해 Machine을 업데이트할 수 있어요. 또는fly secrets deploy명령으로 스테이징된 시크릿과 함께 현재 릴리스를 재배포할 수 있어요. 이는 소스 코드에서 이미지를 다시 빌드하지 않고자 할 때 유용해요.
시크릿 목록 보기
앱에 설정된 시크릿을 나열해요. 목록에는 시크릿 이름만 표시되며 값은 시크릿이므로 표시되지 않아요.
예를 들어:
fly secrets list
NAME | DIGEST | DATE
+--------------+----------------------------------+---------+
MY_SECRET | b9e37b7b239ee4aefc75352fe3fa6dc6 | 17s ago
DATABASE_URL | cdbe3268a82bfe993921b9cae2a526af | 17s ago
보안상의 이유로 우리는 시크릿의 평문 값을 읽을 수 있는 권한을 허용하지 않아요.
시크릿 제거
이름으로 앱에서 하나 이상의 시크릿 값을 제거해요.
다음 예시는 앱에서 두 개의 시크릿을 제거해요:
fly secrets unset MY_SECRET DATABASE_URL
시크릿을 파일로 마운트하기
fly.toml의 [[files]] 섹션을 사용해 시크릿 값을 부팅 시점에 Machine의 파일 시스템에 직접 쓸 수 있어요. 이는 앱이 디스크에서 기대하는 개인 키 같은 것에 유용해요.
시크릿은 base64로 인코딩되어야 해요.
예시:
fly secrets set SUPER_SECRET=$(cat filename.txt | base64)
secret_name: fly secrets set으로 설정된 앱 시크릿의 이름이에요. 시크릿의 값이 파일에 기록돼요. 참조하는 시크릿 값은 base64로 인코딩되어 있어야 해요.
guest_path: 부팅 시 파일이 기록될 Machine 내부의 전체 경로예요.
[[files]]
guest_path = "/path/to/secret.txt"
secret_name = "SUPER_SECRET"
이것을 다른 [[files]] 항목과 함께 사용할 수 있어요. 자세한 내용은 fly.toml 참조를 확인하세요.