sops-nix와 agenix가 복호화된 비밀값을 디스크에 저장하지 않는다는 설명은 봤지만, 실제로 어떤 이점이 있는지 궁금함
암호화된 비밀값과 그 키가 둘 다 디스크에 있는 것 아닌가? 아니면 둘 중 하나가 TPM 같은 곳에 저장되는 건가?
Nix를 막 쓰기 시작했고, 작은 셀프호스팅 배포에서는 단순해서 scp로 파일시스템에 넣는 방식을 쓰고 있음
조금 찾아보니 SSH 개인키를 TPM으로 보호할 수 있는 듯하고, VM에서도 가능한지 궁금했는데 vTPM 지원이 있을 수 있다니 스스로 답을 찾은 셈임
내 서버에서는 sops-nix를 쓰는데, 내 위협 모델에는 충분하고 잘 동작한다고 봄. 이제 SSH 개인키를 TPM에 저장하는 방식이 궁금해짐
서버 쪽에는 NixOps 접근도 있음. Colmena가 하는 방식을 보면 됨: https://colmena.cli.rs/0.4/features/keys.html
핵심은 비밀값을 가진 신뢰된 머신이 원격 서버로 밀어 넣는 구조임. 지금 scp로 하는 것과 비슷하지만, 그 과정을 더 Nix답게 구동함
좋아하는 표현을 꺼낼 때가 됐네. “상황에 따라 다름!” 여기서 비밀값 관리는 두 문제를 동시에 다룸: 디스크 위의 비밀 파일을 보호하는 것, 그리고 시스템을 빌드하는 데 쓰는 설정 안의 비밀값을 보호하는 것. 결국 그 값들은 어딘가에는 있어야 하기 때문임
최근 며칠 밤을 들여 내 시스템 flake에 agenix 계열을 다시 세팅했기 때문에, agenix에 대해서만 말할 수 있음. 관심 있는 사람에게는 agenix-rekey를 골랐는데, 비밀값이 들어간 .yml 파일을 둘 필요가 없고 이미 해둔 것처럼 비밀값을 전부 Nix 안에서 설정할 수 있기 때문임
암호화된 비밀값은 Nix store에 있고, Nix store의 다른 것들처럼 전역 읽기 가능함. 그 비밀값을 푸는 SSH 개인키는 보통 실제 SSH 서버의 개인키이고, 선택적으로 그렇지 않게 할 수도 있음. 비밀값은 활성화 시점, 대략 부팅 시점에 복호화되어 /run/agenix/<user>에 놓임 secrix라는 도구는 더 나아가 비밀값을 systemd 서비스에 묶고, 그 서비스를 비밀값이 필요한 서비스에 다시 묶음. 그래서 해당 서비스가 실행 중일 때만 비밀값이 복호화됨. 다만 실제로는 NixOS 사용자가 서비스를 자주 켰다 끄는 일이 드물어서 대부분 계속 실행 중이라는 뜻이 되기 쉽다. 사용자 생성 같은 시스템 활성화용 비밀값에는 맞을 수 있음
agenix-rekey는 재키잉을 덜 귀찮게 만들고, secrets.nix 대신 flake 출력으로 대체해 줌. 키의 한쪽 절반으로 YubiKey 분할 ID를 쓴다. 재키잉은 그 키와 다른 절반으로 인증해서 비밀값을 복호화한 뒤, 서버의 SSH 공개키로 다시 키를 거는 과정임. 공개키는 시스템 설치 시점에 생성되며, 나는 nixos-anywhere에 --copy-host-keys를 써서 설치 클로저에서 생성된 키를 가져옴. 암호화된 비밀값은 저장소 안에 두지만, 신뢰된 빌더만 접근 가능한 별도 서브모듈에 둠
참고로 vTPM은 대개 하드웨어 기반이 아니고, 많은 제공자는 TPM을 제공하더라도 대부분 TPM v2가 아니라 TPM v1.2만 제공함. 내 제공자인 BinaryLane도 그렇다. 보안 계층이 하나 더 생기는 건 맞지만, 실제 TPM 같은 마법의 HSM은 아니며 제공자나 호스트 노드 침해로부터 보호해 주지는 못함. 실제 HSM 기반 vTPM을 허용하려면 제공자 입장에서는 비용이 매우 클 것 같고, AWS는 AWS 가격으로 제공하는 듯함
나는 agenix + agenix-rekey + age-plugin-1p를 씀
마스터 키는 1Password 안에 있어서, 노트북 디스크에 어떤 자격 증명도 두지 않고도 어느 서버의 비밀번호든 편집, 조회, 재키잉할 수 있음
실행 중 키 접근이 필요한 서버에는 접근권을 줄 수 있음. agenix-rekey에 해당 서버가 어떤 키를 볼 수 있는지 알려주고 agenix rekey를 실행하면, 그 서버가 복호화할 수 있는 암호화된 키 버전이 Nix store에 기록됨. 해당 서버의 SSH 개인키는 그 서버에만 있고 절대 밖으로 나가지 않음. agenix-rekey는 재키잉에 공개키만 필요함
따라서 비밀값이 털리는 경우는 내 1Password 계정이 해킹되거나, 그 비밀값을 쓰는 서버가 해킹되는 경우임
Agenix에서는 기본적으로 암호화된 비밀값을 /etc/ssh/ssh_host_ed25519_key로 복호화한 뒤, /run/agenix.d에 마운트된 ramfs에 넣음
그래서 맞음. 암호화된 내용, 암호화 키, 복호화된 내용이 모두 파일시스템에서 접근 가능함
이렇게 하면 전체 NixOS 설정을 공개로 공유할 수도 있음. 그렇게 하는 사람은 많지 않지만, Nix의 약속 중 절반은 다른 사람도 내 시스템 문제를 같이 디버깅할 수 있다는 데 있다고 느낌
agenix로 자격 증명을 관리하다가 그냥 파일시스템에 두는 방식으로 옮겼음. 더 단순하고, 재설치도 내게는 드문 일이기 때문임
게다가 오래 유지되는 자격 증명도 점점 줄고 있음. 장기 자격 증명 복사에서 벗어나 하드웨어 기반 자격 증명으로 가고 있고, 그것을 직접 쓰거나 짧게 유지되는 자격 증명으로 교환하는 방향으로 옮겨가는 중임
Lobste.rs 의견들
암호화된 비밀값과 그 키가 둘 다 디스크에 있는 것 아닌가? 아니면 둘 중 하나가 TPM 같은 곳에 저장되는 건가?
Nix를 막 쓰기 시작했고, 작은 셀프호스팅 배포에서는 단순해서
scp로 파일시스템에 넣는 방식을 쓰고 있음조금 찾아보니 SSH 개인키를 TPM으로 보호할 수 있는 듯하고, VM에서도 가능한지 궁금했는데 vTPM 지원이 있을 수 있다니 스스로 답을 찾은 셈임
서버 쪽에는 NixOps 접근도 있음. Colmena가 하는 방식을 보면 됨: https://colmena.cli.rs/0.4/features/keys.html
핵심은 비밀값을 가진 신뢰된 머신이 원격 서버로 밀어 넣는 구조임. 지금
scp로 하는 것과 비슷하지만, 그 과정을 더 Nix답게 구동함최근 며칠 밤을 들여 내 시스템 flake에 agenix 계열을 다시 세팅했기 때문에, agenix에 대해서만 말할 수 있음. 관심 있는 사람에게는 agenix-rekey를 골랐는데, 비밀값이 들어간
.yml파일을 둘 필요가 없고 이미 해둔 것처럼 비밀값을 전부 Nix 안에서 설정할 수 있기 때문임암호화된 비밀값은 Nix store에 있고, Nix store의 다른 것들처럼 전역 읽기 가능함. 그 비밀값을 푸는 SSH 개인키는 보통 실제 SSH 서버의 개인키이고, 선택적으로 그렇지 않게 할 수도 있음. 비밀값은 활성화 시점, 대략 부팅 시점에 복호화되어
/run/agenix/<user>에 놓임secrix라는 도구는 더 나아가 비밀값을 systemd 서비스에 묶고, 그 서비스를 비밀값이 필요한 서비스에 다시 묶음. 그래서 해당 서비스가 실행 중일 때만 비밀값이 복호화됨. 다만 실제로는 NixOS 사용자가 서비스를 자주 켰다 끄는 일이 드물어서 대부분 계속 실행 중이라는 뜻이 되기 쉽다. 사용자 생성 같은 시스템 활성화용 비밀값에는 맞을 수 있음
agenix-rekey는 재키잉을 덜 귀찮게 만들고,
secrets.nix대신 flake 출력으로 대체해 줌. 키의 한쪽 절반으로 YubiKey 분할 ID를 쓴다. 재키잉은 그 키와 다른 절반으로 인증해서 비밀값을 복호화한 뒤, 서버의 SSH 공개키로 다시 키를 거는 과정임. 공개키는 시스템 설치 시점에 생성되며, 나는 nixos-anywhere에--copy-host-keys를 써서 설치 클로저에서 생성된 키를 가져옴. 암호화된 비밀값은 저장소 안에 두지만, 신뢰된 빌더만 접근 가능한 별도 서브모듈에 둠참고로 vTPM은 대개 하드웨어 기반이 아니고, 많은 제공자는 TPM을 제공하더라도 대부분 TPM v2가 아니라 TPM v1.2만 제공함. 내 제공자인 BinaryLane도 그렇다. 보안 계층이 하나 더 생기는 건 맞지만, 실제 TPM 같은 마법의 HSM은 아니며 제공자나 호스트 노드 침해로부터 보호해 주지는 못함. 실제 HSM 기반 vTPM을 허용하려면 제공자 입장에서는 비용이 매우 클 것 같고, AWS는 AWS 가격으로 제공하는 듯함
agenix+agenix-rekey+age-plugin-1p를 씀마스터 키는 1Password 안에 있어서, 노트북 디스크에 어떤 자격 증명도 두지 않고도 어느 서버의 비밀번호든 편집, 조회, 재키잉할 수 있음
실행 중 키 접근이 필요한 서버에는 접근권을 줄 수 있음. agenix-rekey에 해당 서버가 어떤 키를 볼 수 있는지 알려주고
agenix rekey를 실행하면, 그 서버가 복호화할 수 있는 암호화된 키 버전이 Nix store에 기록됨. 해당 서버의 SSH 개인키는 그 서버에만 있고 절대 밖으로 나가지 않음. agenix-rekey는 재키잉에 공개키만 필요함따라서 비밀값이 털리는 경우는 내 1Password 계정이 해킹되거나, 그 비밀값을 쓰는 서버가 해킹되는 경우임
/etc/ssh/ssh_host_ed25519_key로 복호화한 뒤,/run/agenix.d에 마운트된 ramfs에 넣음그래서 맞음. 암호화된 내용, 암호화 키, 복호화된 내용이 모두 파일시스템에서 접근 가능함
https://github.com/oddlama/agenix-rekey
게다가 오래 유지되는 자격 증명도 점점 줄고 있음. 장기 자격 증명 복사에서 벗어나 하드웨어 기반 자격 증명으로 가고 있고, 그것을 직접 쓰거나 짧게 유지되는 자격 증명으로 교환하는 방향으로 옮겨가는 중임