사용자 환경을 설정하는 openssh/telnet 코드에서 다음을 사용하고 있습니다.
setenv("TEST_ENV", "testing", 1);
하지만 이는 사용자가 수정할 수 있습니다. 읽기 전용 환경 변수로 만드는 방법이 있나요?
답변1
루틴에 아무것도 없음프로세스 환경변수를 읽기 전용으로 만들려면 쉘에만 자체 환경/변수에 대한 이 개념이 있습니다(둘은 방식이 겹치지만 서로 다른 것으로 이해해야 합니다). 동일하게 적용됩니다유형정수, 배열, 함수 등과 같은 속성
예를 들어 제한된 쉘 사용을 고려해 보셨나요 rbash
? 시작 스크립트에서 실행되도록 설정할 수 있습니다 rbash
.) 너무 제한적일 수도 있지만 댓글에서 제기된 문제를 주로 해결합니다.readonly TEST_ENV
rbash
환경은 각 프로세스의 읽기/쓰기 부분입니다(참조:여기그리고여기세부 사항), 프로세스는 (를 통해 environ[]
) 데이터 섹션에 직접 쓸 수 있을 뿐만 아니라 이에 대한 포인터를 변경할 수도 있습니다. 어셈블리에 능숙하고 시작 코드에 대한 방법을 찾을 수 있다면 이에 대해 뭔가를 할 수는 있지만(예: 읽기 전용 페이지로 이동) crt
권장하지는 않습니다 ;-)
사용자가 실행하는 특정 명령에 특정 환경이 있어야 하는 경우 그룹 실행을 설정하고 이를 사용하여 sudo
올바른 변수(예: /etc/environment
또는 env_file
지시문을 통해)를 설정하고 특정 그룹으로 명령을 실행할 수 있습니다(uid 유지). 최신 버전은 noexec
대부분의 플랫폼을 지원하며 새로운 쉘이 실행되는 것을 방지하는 데 사용할 수 있습니다(적법한 프로그램이 손상될 수 있음에도 불구하고 fork()
) exec()
.
마지막 옵션으로, LD_PRELOAD
관련 libc 함수 등을 래핑하여 일부/전체 사용자 프로세스에 대해 제어된 환경을 설정하기 위해 자체 라이브러리를 사용할 수 있습니다 getenv() putenv()
.libfaketime시간 관련 libc 함수가 바로 이 작업을 수행합니다. 이라는 잘 알려지지 않은 도구가 있습니다.시간 여행사실 비슷하긴 합니다만,반품역경 속에서도 통제력을 유지하기 setenv()
위한 후크입니다 .getenv()
LD_PRELOAD
가장 신뢰할 수 있는 접근 방식은 호출을 필터링하여 수정을 방지하고 항상 원하는 값(아마도 파일에서)을 반환하도록 필터링 setenv() unsetenv() putenv()
하는 것입니다. 이 접근 방식은 환경 메모리의 직접적인 조작을 방지하지는 않지만 libc API에 의존하는 프로세스를 제어할 때마다 값을 확인해야 합니다. 초기화 중에 직접 사용되지만 호출되기도 합니다.clearnv()
getenv()
environ[]
getenv()
bash
environ[]
getenv()
답변2
이 명령을 사용하여 POSIX 호환 셸에서 읽기 전용 변수를 설정할 수 있습니다 readonly
.
readonly VAR=foo # POSIX
declare -r VAR=foo # bash
export VAR
이는 사용자가 변경하는 것을 방지하는 보안 기능이 아닙니다. 사용자는 언제든지 새 쉘을 생성하고 변수를 변경할 수 있습니다.
답변3
/etc/skel/.bashrc
또는 사용자별로 설정할 수 있습니다.~/.bashrc
readonly TEST_ENV