문제

저는 사용자를 대신하여 네트워크 인터페이스를 관리하고 변경을 위해 루트가 필요한 여러 외부 프로그램(예: ifconfig)을 호출하는 응용 프로그램을 개발 중입니다.(구체적으로 로컬 인터페이스의 IP 주소 변경 등) 개발 중에는 IDE를 루트로 실행하고(으), 디버거를 루트로 실행했습니다(이중-으).최종 사용자가 루트가 아닌 계정으로 이를 실행할 수 있는 좋은 방법이 있습니까?나는 GTK, wxPython, Python 및 내 애플리케이션이 루트로 실행될 때 나타나는 공격 표면의 크기를 매우 싫어합니다.

기능을 조사해 보았으나 아직 덜 익은 것 같고 Python에서 사용할 수 있을지 확신할 수 없습니다. 특히 스레드 기반인 경우에는 더욱 그렇습니다.내가 살펴보지 않은 유일한 옵션은 setuid 비트가 설정되어 있고 UI를 대신하여 모든 루트 유형 작업을 수행하는 데몬입니다.루트로 실행하는 것은 사용자에게 문제가 되지 않기 때문에 프로젝트 초기에 이러한 복잡성을 도입하는 것을 주저합니다.

도움이 되었습니까?

해결책

데몬에 대한 당신의 아이디어는 그것이 소개하는 복잡성에도 불구하고 많은 장점이 있습니다. 작업에 일부 사용자 인터페이스 상호 작용이 필요하지 않는 한 루트로, 데몬을 사용하면 허용되고 허용되지 않는 작업을 제어 할 수 있습니다.

그러나 Sudo를 사용하여 루트와 일반 사용자 사이에 제어 된 타협을 만들 수 있습니다. 필요한 특정 도구에 대해 해당 사용자에게 Sudo에 액세스 할 수 있습니다. 이는 "허가 된"루트 발사 만 허용하여 공격 표면을 줄입니다.

다른 팁

당신이 원하는 것은 "그룹"입니다

그룹을 생성하고 작업을 수행하려는 계정이 그룹에 속한다는 것을 지정하고 액세스하려는 리소스가 해당 그룹의 구성원임을 지정합니다.

때때로 그룹 관리는 일종의 짜증이 될 수 있지만, 원하는 것을 할 수 있어야하며 프로그램이 아닌 승인 된 사용자입니다.

(프로그램 승인을 원한다면 특정 사용자를 작성하여 해당 사용자에게 적절한 그룹 멤버십을 제공 한 다음 프로그램 내에서 해당 그룹에 SU를 제공하여 실행중인 사용자에게 능력을 제공하지 않고 작업을 실행할 수 있습니다.)

응용 프로그램에 대한 Selinux 정책을 작성하고 배포 할 수 있습니다. Selinux는 필요한 종류의 세밀한 액세스를 허용합니다. Selinux를 사용할 수 없거나 사용하지 않으면 데몬이 갈 길입니다.

응용 프로그램을 풀 타임으로 실행하지는 않지만 응용 프로그램 세트 루트를 만들거나 특정 애플리케이션을 위해 Sudo와 같은 것을 사용하여 루트가 될 수있는 일부 ID에 대한 설정을 탐색하고 싶을 수도 있습니다. 로그인 할 수없는 계정을 설정하고 SetUid를 사용하여 프로그램의 ID를 변경하고 (필요할 때 임시 적으로) Sudo가 비밀번호를 자랑하지 않도록 설정했지만 항상 특정 작업에 대한 해당 계정에 액세스 할 수 있습니다.

이런 식으로 귀하의 프로그램은 정상적으로 실행할 때 특별한 권한이 없으며 필요할 때만 특권을 높이고 Sudo는 특정 프로그램 만 실행하도록 제한됩니다.

UNIX 개발을 많이 한 이후로 잠시 동안 Sudo를 비밀번호를 자랑하지 않도록 Sudo를 설정할 수 있는지 (또는 API가 있더라도) Sudo를 설정할 수 있는지 확실하지 않습니다. 필요할 때만 setUID를 루팅 할 수 있습니다.

편집]처럼 보입니다 수도 nopasswd 모드가 있으므로 프로그램을 외부 명령으로 실행하기 때문에 작동해야한다고 생각합니다.

전통적인 방법은 세트 헬퍼를 만들고 사용하여 필요한 모든 것을 수행하는 것입니다. 그러나 세트 헬퍼를 올바르게 작성하는 것은 까다 롭습니다 (보호해야 할 몇 가지 공격 벡터가 있습니다).

현대적인 방법은 데몬 (루트로 실행, 부팅 시작)을 사용하여 나머지 응용 프로그램의 요청을 듣는 것입니다. 이런 식으로, 당신의 공격 표면은 대부분 당신이 선택한 IPC로 제한됩니다 (D-Bus를 제안합니다. 이것은 현대적인 방법입니다).

마지막으로 네트워크 인터페이스를 관리하는 경우 네트워크 관리자가 최신 분포에서 수행하는 것과 매우 유사합니다. 네트워크 관리자와 어떻게 든 통합하려고 시도하거나 (조작과 충돌하지 않음) 적어도 작동 방식을 살펴 보는 것이 좋습니다.

"정상적인"사용자와 루트 사이에있는 단일 사용자는 없습니다. 루트가 있고 사용자가 있습니다. 사용자는 다른 수준의 기능을 가질 수 있습니다. "일반적인"사용자보다 강력하지만 루트만큼 강력하지 않은 것을 원한다면 원하는 기능을 가진 새 사용자 만 만들지 만 원하지 않는 권한을주지 마십시오.

저는 해당 언어에 필요한 명령이 무엇인지 설명할 만큼 Python에 익숙하지 않지만, 부모 프로세스와 자식 프로세스 간에 통신하기 위해 파이프를 분기하고 사용하여 이를 수행할 수 있어야 합니다.다음과 같은 내용이 있습니다.

  • sudo 또는 suid를 통해 루트로 프로그램을 실행하십시오.
  • 시작 시 프로그램은 즉시 상위 프로세스와 하위 프로세스 간의 통신을 위한 파이프를 분기하고 설정합니다.
  • 하위 프로세스는 루트 권한을 유지하지만 파이프로부터의 입력을 기다리고 있습니다.
  • 상위 프로세스는 루트를 삭제하고(uid를 실행 중인 사용자의 uid로 다시 변경) GUI를 표시하고 사용자와 상호 작용하며 권한이 없는 사용자가 사용할 수 있는 모든 작업을 처리합니다.
  • 루트 권한이 필요한 작업이 수행될 때 (루트가 아닌) 부모 프로세스는 파이프를 통해 명령을 실행하는 (루트) 자식 프로세스로 명령을 보내고 선택적으로 부모에게 다시 보고합니다.

이는 독립 데몬보다 작성하기가 조금 쉬울 뿐만 아니라 실행하기에도 더 편리할 것입니다(데몬이 실행 중인지 여부에 대해 걱정할 필요가 없기 때문입니다). 또한 GUI 및 기타 기능을 허용합니다. 루트가 아닌 사용자로 실행하기 위해 루트 권한이 필요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top