프로그램에 권한을 부여하는 올바른 방법

프로그램에 권한을 부여하는 올바른 방법

직장에는 더 높은 수준의 권한으로 작업(IP 경로 추가, Wi-Fi 구성 파일 설정, 직렬 장치에서 읽기)을 수행해야 하지만 해당 "시스템의 다른 작업도 시작할 수 있는 "시스템"(파이썬) 에이전트가 있습니다. " 프로그램, 파일 읽기/쓰기/로컬 데이터베이스. 지금까지 나는 두 가지 옵션을 알고 있습니다.

  1. "기본" 사용자에게 더 높은 수준의 권한을 추가하고 일반 사용자로 시작합니다. "기본" 사용자는 엔지니어가 로그인하는 사용자입니다.
  2. 별도의 "테스트" 사용자를 생성하고 이러한 권한이 있는 새 그룹을 생성하고 해당 그룹을 "테스트" 사용자에 추가하여 필요한 권한을 추가합니다.

내가 아는 한, 옵션 1은 작업을 수행하는 데 매우 "안전한" 방법이 아닙니다.
옵션 2는 일반 파일 권한 및 새 터미널 시작에 어려움이 있습니다(X11 디스플레이 문제). 이러한 프로그램을 실행하면 "테스트" 사용자가 사용되며 기본 사용자는 이러한 프로그램에서 생성된 모든 파일에 액세스할 수 없습니다. 또한 "시스템"은 이 사용자를 자동으로 설정할 수 있어야 하며 에이전트는 UI를 통해 시작/중지할 수 있어야 하므로 "기본" 사용자로 시작해야 하며 비밀번호가 필요합니다. "시스템" 파일에 저장됨)

옵션 2가 그만한 가치가 있나요, 아니면 옵션 1을 선택해야 하나요? 또한 이 "시스템"은 직장의 많은 컴퓨터에서 사용될 것이므로 이는 단지 내 개인용 컴퓨터만이 아니라는 점을 지적하고 싶습니다.

답변1

운영 체제 관련 작업(예: 라우팅 구성)에 대한 권한을 위임하려면 파일 권한을 광범위하게 수정해야 합니다. OTOH 권한이 없는 사용자가 데이터 파일에 액세스할 수 있도록 권한을 구성하는 것은 우리가 매일 수행하는 작업입니다.

프로그램 권한 부여

프로그램이 실행되는 권한은 프로그램을 호출하는 사용자로부터 상속됩니다. 몇 가지 예외가 있지만 Linux/Unix(특히 setuid, MAC 및 기능)에 대해 더 많이 알기 전까지는 이러한 예외를 피해야 합니다.

라우팅 변경을 허용하도록 권한을 변경하려고 하면 시스템 보안이 손상될 수 있으며 다음에 업그레이드를 적용할 때 변경 사항이 되돌려질 수 있습니다.

이 두 가지 다른 것에는 두 가지 다른 솔루션이 필요합니다.

먼저 라우팅 및 Wi-Fi 구성: 이를 위해 sudo를 루트로 구성합니다. 가능하다면 동작을 비대화형 쉘 스크립트로 패키징하세요. 이렇게 하면 sudo 백도어를 방지하는 데 도움이 됩니다.

"기본" 사용자에게

귀하의 시스템에서 "기본 사용자"가 무엇을 의미하는지 알 수 없습니다.

데이터 액세스(즉, Linux 배포판에서 유지 관리하지 않는 파일)의 경우 다양한 액세스 유형을 가져야 하는 사용자 범주를 설명하는 모델을 정의한 다음 표준 그룹을 사용하여 해당 액세스를 허용해야 합니다. 인간과 유사하지 않은 대화형 사용자 계정을 추가하는 것은 잘못된 패턴입니다. 실제 기존 사용자에 대한 그룹을 추가/제거합니다.

팁: chmod g+s $DIRNAME$DIRNAME에 생성된 새 파일/디렉터리의 그룹 소유권은 유지됩니다.

답변2

@symcbean을 사용해 보았지만 chmod g+s $DIRNAME파일 그룹만 설정하고 사용자를 설정하는 옵션을 찾지 못했습니다. 또한 그룹이 로그인한 사용자와 동일하더라도 iirc 파일은 여전히 ​​RO 모드에서 열립니다.

Python 프로그램을 실행하기 위해 내부 ENV를 사용하는 것에 대한 나의 sudo초기 설명은 잘못된 것 같습니다. Python ENV 바이너리에 대한 전체 경로를 제공하여 이 작업을 성공적으로 수행했기 때문입니다. @telcoM이 제공한 링크를 읽고 프로그램 내에서 실행했습니다 setegid. seteuid이를 통해 프로그램은 호출자의 권한으로 파일을 생성하고 필요한 root.

내가 가진 마지막 문제는 프로그램이 다른 터미널에서 다른 프로그램을 시작했지만 루트 소유의 그놈 터미널(다른 프로필과 도구 모음이 있음)로 보이는 곳에서 실행되었거나 XAUTH 문제 시작으로 인해 전혀 실행되지 않았다는 것입니다. 위로. 이는 --preserve-env매개변수를 사용하여 해결 됩니다 sudo.

그래서 내 현재 솔루션은 다음과 같습니다.

  1. 런처 사용sudo --preserve-env <python_env_binary> <python_program>
  2. (파이썬 프로그램 내부) 실행 중인지 sudo, env가 보존되어 있는지 확인( geteuid0인지, $HOME 환경 변수가 아닌지 확인 /root)
  3. $SUDO_UID 및 $SUDO_GID에서 발신자 ID 가져오기
  4. 발신자 ID를 사용하여 설정 setegid( seteuidGID가 우선 적용됩니다!)

이 솔루션이 적합한지 알려주세요.

관련 정보