오류 시 멈추는 단계로 OpenVPN 클라이언트 프로비저닝하기
다섯 단계가 프로비저닝 스크립트가 절반만 설치된 상태를 남기지 않게 합니다. 입력 검증, 세트 준비, 원자적 교체, 단일 소유자 활성화, 해제 계획입니다.
오류를 보고한 뒤 계속 진행하는 프로비저닝 스크립트는 아예 실행되지 않는 스크립트보다 나쁩니다. 클라이언트 설정은 보호된 키, 게이트웨이의 신원, 그리고 이미 트래픽을 처리하고 있을 수 있는 서비스를 건드립니다. 각각에는 중지 조건이 필요하고, 스크립트는 멈춘 시점에 어느 단계에 도달했는지 알아야 합니다.
전체를 다섯 개의 검사 지점을 가진 하나의 트랜잭션으로 다루고, 각 검사 지점이 스스로 진행을 거부하게 하십시오.
파일 시스템을 건드리기 전에 입력을 고치십시오
명시적인 계약으로 시작하십시오. 신원 하나, 프로필 출처 하나, 의도된 서비스 소유자 하나입니다. 프로필이 존재하는지, 그것이 참조하는 인증서와 키를 읽을 수 있는지, 대상 디렉터리가 예상 패키지의 것인지 확인하십시오. 경로가 해석된다고 해서 그 뒤의 자료가 완전하다는 증거는 아닙니다.
빈 변수는 일찍 거부하십시오. 아무것도 아닌 값으로 확장되는 설정되지 않은 $DEVICE 는 install -m 400 $KEY /etc/openvpn/client/ 를 디렉터리를 향한 복사본으로 만들어 버리고, 실패는 나중에 자신의 키를 읽지 못하는 서비스로 나타납니다.
스테이징 디렉터리에서 프로필 세트를 구성하십시오
먼저 완전한 세트를 비공개 장소에 만드십시오. 프로필, CA, 클라이언트 인증서, 키, 그리고 프로필이 호출하는 모든 보조 프로그램입니다. install -m 400 -o root -g root 로 복사하여 권한을 나중이 아니라 생성 시에 설정하십시오. 그런 다음 프로필 안의 참조를 확인하십시오. 상대 경로인 ca 또는 key 줄은 서비스가 시작되는 순간 유닛의 작업 디렉터리를 기준으로 해석되기 때문입니다. 전체 세트가 검증될 때까지 활성 디렉터리에 아무것도 기록해서는 안 됩니다.
이 실행이 무엇을 만들었는지에 대한 비밀이 아닌 지문을 기록하십시오. 예를 들어 버전 표시 옆에 저장한 sha256sum office.conf 입니다. 바로 그 단일 값이 재실행에서 업데이트와 아무 작업도 하지 않은 경우를 구분하게 합니다.
원자적으로 교체하고 이전 세트를 보관하십시오
파일 시스템이 허용하는 곳에서는 준비한 세트를 한 번의 작업으로 제자리에 옮기고, 검토된 이전 세트는 타임스탬프가 붙은 이름으로 보관하십시오. 오래된 키 옆에 새 프로필을 남기는 부분 복사본은 잘못된 신원으로 인증하고 그 이유에 대해 유용한 기록을 남기지 않는 서비스를 만듭니다. 교체가 원자적일 수 없다면 프로필이 마지막에 도착하도록 이동 순서를 정하십시오.
대상이 이미 존재한다면 이 실행이 업데이트인지, 동일한 재실행인지, 다른 장치의 프로필과의 충돌인지 명시적으로 결정하십시오. 다른 신원에 속한 프로필을 조용히 덮어쓰는 것이 두 머신이 하나의 인증서를 공유하게 되는 경로입니다. 대신 실행을 거부하고 충돌하는 소유자의 이름을 밝히십시오.
단일 소유자를 활성화하고 증명하십시오
활성화 경로를 하나 고르십시오. systemd 인스턴스이든 NetworkManager 이든 하나를 일관되게 사용하십시오. 활성화된 유닛 옆에서 관리되지 않는 openvpn 프로세스를 시작하면 터널 두 개, 경쟁하는 DNS 업데이트, 그리고 중지 명령이 어느 쪽을 대상으로 하는지에 대한 명확한 답이 없습니다. 활성화 후 systemctl is-active openvpn-client@office 를 확인하고, 그다음 원격 프리픽스로 가는 경로, 그다음 터널이 설치한 리졸버에 대해 resolvectl status 를 확인하십시오. 터널이 존재하는 이유인 자원 하나에 도달하여 마치십시오.
실행 중인 프로세스와 녹색 트레이 아이콘은 프로세스의 사실이며, 신원과 트래픽 정책이 인계를 견뎠다는 증거는 아닙니다.
재실행과 해제는 별개의 워크플로입니다
두 번째 실행은 동일한 검토된 파일과 동일한 소유자로 수렴해야 하며, 두 번째 계정이나 두 번째 데몬을 만들지 않아야 합니다. 해제는 그 자체의 절차입니다. 정확한 소유자를 중지하고, 정책에 따라 로컬 프로필을 보관하거나 삭제하고, 게이트웨이에서 신원을 철회하십시오. 로컬 키 파일을 삭제해도 이미 머신을 떠난 복사본은 철회되지 않습니다.
터널에 의존하지 않는 복구 경로를 유지하십시오. 예를 들어 콘솔 접근이나 두 번째 관리 경로입니다. 머신 밖으로 잠그는 프로비저닝 변경은 모든 단계가 성공을 보고했더라도 실패한 변경입니다.
보관할 가치가 있는 스크립트는 소유권과 증거를 둘러싼 트랜잭션입니다. 권한 있는 복사 명령의 짧은 목록은 같은 것이 아닙니다.