OpenVPN은 암호를 터미널에서 읽고 stdin에서는 읽지 않습니다
OpenVPN이 실제로 암호를 읽는 위치, stdin에 둔 파일이 실패하는 이유, Linux와 macOS에서 스크립트 로그인의 세 가지 지원 경로.
OpenVPN은 제어 터미널에서 사용자 이름과 암호를 요구하며, 표준 입력으로 리디렉션된 파일은 그 터미널이 아닙니다. 바로 이 한 가지가 암호가 파이프 안에 있는데도 스크립트가 멈추는 이유를 설명합니다. 프롬프트는 클라이언트가 그리고 읽기는 터미널 장치에서 이루어지므로 stdin을 리디렉션해도 아무것도 바뀌지 않습니다. 클라이언트를 문서화된 입력 경로 중 하나로 공급하면 같은 스크립트가 첫 시도에 연결됩니다.
세 가지 경로가 거의 모든 경우를 덮으며, 각각은 자기 방식으로 실패합니다. 클라이언트가 실제로 보여주는 프롬프트를 기준으로 고르고, 스크립트로 만들기 가장 쉬운 옵션을 기준으로 고르지 마십시오.
프롬프트는 stdin에서 오지 않습니다
OpenVPN이 자격 증명을 필요로 하면 제어 터미널을 열고 거기서 읽습니다. 그래서 대화형 테스트는 멀쩡해 보이지만 cron이나 unit 파일 아래에서 같은 명령은 아무도 보지 않는 로그에 프롬프트만 남긴 채 멈춰 있습니다. 어떤 빌드는 터미널이 없으면 표준 입력으로 되돌아가는데, 그 불일치는 배포 전까지 문제를 숨기므로 확실한 실패보다 나쁩니다.
코드를 쓰기 전에 환경을 확인하고, 스케줄러나 서비스 관리자가 쓸 것과 같은 사용자, 같은 stdin으로 클라이언트를 실행하십시오. 프롬프트가 로그에 전혀 나타나지 않고 프로세스가 진행되지 않는다면, 존재하지 않는 터미널을 무언가가 기다리고 있습니다.
첫 번째 경로: 두 줄짜리 자격 증명 파일
인증 옵션은 경로를 받고, 파일에는 정확히 두 줄, 사용자 이름 다음 암호만 들어 있습니다. 작업 디렉터리에 굴러다니는 자격 증명 파일이 바로 잘못된 계정이 쓰이는 경로이므로, 기본 파일 이름에 기대지 말고 경로를 명시하십시오. 모드를 0600으로 두고 클라이언트를 실행하는 계정에 소유권을 주십시오.
클라이언트는 시작할 때 그 파일을 한 번 읽으므로, 암호를 바꾸려면 프로세스를 다시 시작해야 합니다. 보통은 그것이 원하는 동작이며, 교체 절차 옆의 runbook에 들어갈 내용입니다.
두 번째 경로: 키 암호 문구를 위한 askpass
암호 문구로 보호된 개인 키는 두 번째의 다른 프롬프트를 띄우고, 그것에는 파일 기반의 답이 있습니다: askpass 옵션이 파일의 첫 줄에서 암호 문구를 읽습니다. SSH 기반 터널에서는 클라이언트가 실행하는 askpass 프로그램이 그에 해당하며, 그 표준 출력이 비밀이 됩니다.
어느 형태도 비밀을 인자 목록에 넣지 않으며, 둘 다 그것을 파일로 또는 그것을 출력하는 실행 파일로 남겨 둡니다. 보호는 파일 권한과 프로세스 소유권이지 은닉이 아닙니다. 코드에 박아 넣은 문자열을 그대로 출력하는 도우미는 단계만 늘어난 비밀입니다.
세 번째 경로: 포털 클라이언트 자체의 CLI
엔터프라이즈 클라이언트는 보통 창 없이 이름 붙은 포털에 연결하는 명령줄 진입점을 제공하며, 그것이 지원되는 경로입니다. Linux에서 GlobalProtect 클라이언트는 CLI를 통해 연결과 인증서 가져오기 작업을 제공하고, 인증서 인증을 쓰는 포털은 자동 연결이 동작하기 전에 가져오기 단계가 필요합니다. 실제 종료 상태를 얻고, 창 포커스에 의존하지 않으며, 잠긴 화면에서도 살아남으므로 합성 키 입력보다 그것을 택하십시오.
첫 연결에 여전히 사람이 인증서를 받아들여야 한다면 자동화는 끝난 것이 아닙니다. 설정 중에 가져오기를 하고 필수 조건으로 기록하십시오.
흐름에 의사 터미널이 필요할 때
암호를 묻고 이어 일회용 코드를 묻는 순서에는 읽을 파일 하나가 없습니다. Expect 같은 터미널 드라이버가 맞는 도구이며, 각 패턴을 차례로 기다리고 무언가를 맞추기 전에 프로세스가 시작되어 있어야 합니다.
두 가지 실패가 지배적입니다. 클라이언트를 띄우지 않고 프롬프트를 기다리는 스크립트는 영원히 기다리고, Tcl은 셸이 아니므로 expect 블록 안에 쓴 셸 산술은 읽히는 대로 평가되지 않습니다. 패턴을 만드는 동안 디버그 플래그를 켜 두고, 끝나면 끄십시오.
새는 비밀, 그리고 그것이 숨는 곳
인자로 넘긴 것은 무엇이든 프로세스 목록에 보이므로 자격 증명은 파일이나 도우미 뒤에 두고 명령줄에는 절대 두지 않습니다. 일회용 코드는 설계상 소모되며 시도마다 새로 만들어야 합니다. 실패 로그는 흔히 사용자 이름을, 때로는 그 이상을 담으므로 어디로 보내기 전에 가리고, 암호를 넣은 설정 파일은 티켓과 저장소에 붙여넣어지기 때문에 비밀은 프로필 자체 밖에 두십시오. 그 상태에서 계정을 바꾸면 모든 사본을 찾아야 하고, 그것이 바로 이 배치가 피하는 비용입니다.
고른 경로를 점검하고, 실제로 클라이언트를 실행할 unit 파일이나 스케줄러에 연결하십시오. 터널은 그 프로세스가 사는 동안만 삽니다.