저는 Linux 서버에서 애플리케이션을 실행하고 있으며 애플리케이션을 실행할 때 다음과 같이 명령줄에 비밀번호를 제공합니다.
./myapplication --smtp-password mypassword
지금까지 우리 애플리케이션에서는 매우 간단한 모니터링 애플리케이션으로 가정하고 "핑" 및 상태 확인을 수행하고 실패 시 이메일을 보내는 것이 매우 간단하기 때문에 암호화/암호 해독 기능을 내장하지 않았습니다.
모든 관리자(다른 세 명의 관리자가 있음)는 ps를 사용하여 프로세스 목록을 나열하고, 명령 인수를 보고, 비밀번호를 찾을 수 있습니다.
숨길 수 있는 방법이 있나요?
답변1
myapplication
더 나은 접근 방식은 다른 수단(예: 표준 입력)을 통해 비밀번호를 얻도록 이를 재정의하는 것입니다 . 환경은 또 다른 옵션이지만 .environ을 통해 동일한 euid(또는 euid 0)를 가진 프로세스에 계속 표시됩니다 /proc/<pid>/environ
.
그렇지 않은 경우 Linux 4.2 이전 버전에서는 비밀번호가 명령줄의 처음 4096바이트 내에 있지 않도록 하여 다른 프로세스가 이를 읽어서 비밀번호를 얻을 수 없도록 하여 노출을 제한할 수 있습니다 /proc/<pid>/cmdline
( ps
이와 같이). 버전 4.2 이상에서는 더 이상 잘리지 않습니다 /proc/<pid>/cmdline
.
예를 들어,zsh
.${(l:4094::/:):-myapplication} --smtp-password=secret
myapplication을 실행할 때 첫 번째 매개변수의 크기는 4095바이트(4096바이트는 PATH_MAX 제한을 초과함)입니다. 따라서 .//////[...]///myapplication
비밀번호는 4095 중단점을 초과합니다.
감사 로그와 셸 기록 파일은 명령줄에 전달된 비밀 문자열과 관련된 또 다른 관심 영역입니다.
답변2
/proc
Linux 시스템에서는 적절한 마운트를 사용하여 프로세스 정보를 숨길 수 있습니다.hidepid
예를 mount -o remount /proc -o hidepid=2
들어, 루트 액세스 권한이 있는 사람에게는 프로세스 정보가 숨겨지지 않습니다. 더 나은 해결책은 명령줄에 민감한 데이터를 포함하지 않는 것입니다.