어쩌면 오늘 커피를 충분히 마시지 못했을 수도 있지만, 세상을 읽을 수 있게 만들어야 하는 이유가 전혀 기억나지 않거나 전혀 생각나지 않습니다 . /proc/PID/cmdline
결국은 그렇지 않습니다./proc/PID/environ
사용자(물론 그룹이나 루트도 가능)만 읽을 수 있도록 하면 명령줄 인수로 입력한 비밀번호가 실수로 유출되는 것을 방지할 수 있습니다.
물론 영향을 미치겠죠다른사용자가 달리는 ps
등 htop
- 하지만 그건 좋은 일이죠, 그렇죠? 이것이 세상을 읽을 수 없게 만드는 열쇠입니다.
답변1
나는 주요하고 아마도 유일한 이유가 역사적이라고 생각합니다. /proc/.../cmdline
원래는 전 세계에서 읽을 수 있었기 때문에 이전 버전과의 호환성을 위해 그대로 유지됩니다. cmdline
1992년 12월 2일에 출시된 0.98.6에 추가되었으며, 모드 444에 변경 로그가 나와 있습니다.
- /proc filesystem extensions. Based on ideas (and some code) by
Darren Senn, but mostly written by yours truly. More about that
later.
"나중에"가 언제인지는 모르겠습니다. 제가 아는 한 Darren Sen의 아이디어는 시간의 안개 속에 사라졌습니다.
environ
이전 버전과의 호환성 주장에 대한 흥미로운 반례입니다. 텍스트를 읽을 수 있도록 시작했지만 1.1.85에서는 소유자만 읽을 수 있게 되었습니다. 아직 관련 변경 로그를 찾지 못해 이유가 무엇인지 모르겠습니다.
/proc/${pid}
(포함)의 전반적인 접근성 및 가시성을 /proc/${pid}/cmdline
제어할 수 있습니다.사용된 proc
마운트 hidepid
옵션,이것은커널 버전 3.3에 추가됨. 마운트 gid
옵션을 사용하면 특정 그룹에 전체 액세스 권한을 부여할 수 있습니다.예를 들어이렇게 하면 모니터링 프로세스는 루트로 실행하지 않고도 모든 것을 볼 수 있습니다.
답변2
프로세스의 명령줄은 항상 Unix에서 공개 정보로 간주되었으며 다음을 통해 항상 액세스할 수 있습니다.ps(1)
주문하다. 대조적으로, 프로세스의 맥락은 결코 그러한 공개 정보가 아닙니다.
ps
원래 Unix 구현에는 디버거로 열리고 커널의 라이브 메모리에서 직접 모든 정보를 추출하는 setuid 실행 파일이 있었습니다 . Linux는 오랫동안 /dev/mem
plan9과 같은 파일 시스템을 지원해 왔으며 /proc
ps
파일 시스템은 간단한 시스템으로 구현되었습니다.고정되지 않은이 프로그램 /proc/<pid>/stat
은 /proc/<pid>/cmdline
. 해당 정보를 얻기 위한 일반 커널/사용자 인터페이스이자 ps
출력 구문 분석(으악)에 대한 쉘 친화적인 대안이기 때문에 불가능하며 ps
.
물론, 실행 중인 다른 사용자
ps
등에 영향을 미치겠htop
지만, 그게 좋은 일이겠죠? 이것이 세상을 읽을 수 없게 만드는 열쇠입니다.
아니요, 이것은 좋은 일이 아닙니다. 이는 표준(위 링크 참조)을 위반하는 것 외에도 루트 권한 없이는 시스템을 디버깅할 수 없게 만들고 보안 이점은 기껏해야 환상에 불과할 것입니다. (유닉스가 발명되었을 당시에는 모호함과 표현의 자유 제한을 통한 보안이 오늘날만큼 인기가 없었습니다.)
이러한 Linux 시스템이 어떤 모습일지는 상상할 필요가 없습니다. 이미 Android가 있고 hidepid
실제 사용자에게는 루팅되지 않은 시스템이 불쾌한 블랙박스입니다(단순히 잠겨 있는 것이 아니라 가능한 모든 방법으로 잠겨 있음). 외부 공격자와 데이터 수집자를 위한 일반적인 Debian 또는 Slackware 데스크탑이나 서버보다 강력하지 않습니다.
답변3
사용자가 루트 명령줄을 보지 못하도록 하려는 경우에만 다음을 수행하십시오.
hidepid=1 옵션을 사용하여 /proc 파일 시스템을 마운트합니다:
sudo mount -o remount,rw,nosuid,nodev,noexec,relatime,hidepid=1 /proc
바라보다https://man7.org/linux/man-pages/man5/proc.5.html, hidepid를 검색하세요.
hidepid 매개변수 값은 다음 세 가지 값을 허용합니다.
0
: 기본값입니다. 모든 사용자는 프로세스 디렉터리에 저장된 모든 사람이 읽을 수 있는 파일을 읽을 수 있습니다.1
: 루트 프로세스 디렉터리는 여전히 /proc에 나열되어 있지만 사용자는 액세스할 수 없습니다. 사용자는 자신의 프로세스 디렉터리에만 액세스할 수 있습니다. 이는 루트가 아닌 사용자로부터 cmdline, sched 또는 status와 같은 중요한 파일을 보호합니다. 이 설정은 실제 파일 권한에 영향을 주지 않습니다.2
: 루트가 아닌 사용자에게는 프로세스 파일이 표시되지 않습니다. 프로세스의 존재는 다른 방법으로 알 수 있지만 유효 사용자 ID(UID)와 그룹 ID(GID)는 숨겨져 있습니다.