오늘 저는 흥미로운 시나리오에 직면했습니다(적어도 Linux 초보자인 저에게는). 드론을 Linux PC에 연결했습니다. 드론 구성 소프트웨어(Betaflight)를 드론에 연결할 수 없습니다. 빠른 Google 검색으로 문제가 해결되었습니다. 기본적으로 드론을 USB 케이블로 연결하면 파일이 생성되고 권한이 /dev/ttyUSB0
부여됩니다 660
. 파일의 소유자는 root
이고 파일의 그룹은 입니다 uucp
. 따라서 간단한 해결책은 이 파일을 666
.
r
방금 이 파일에 대한 권한을 추가했습니다.w
모든 사람, 이건 너무한 것 같아요. 또는 uucp
중요한 그룹이기 때문에 어리석은 것처럼 보이는 Betaflight를 그룹에 추가하거나 더 나빠 보이는 sudo로 실행할 수도 있다고 생각했습니다 .
이 문제를 처리하는 올바른 방법은 무엇입니까? 논리적으로 보면 rw
Betaflight가 이 특정 파일에 액세스할 수 있도록 특별히 규칙을 추가하는 것이 합리적입니다. "리눅스 방식"이 무엇인지 궁금합니다. 나는 임의의 응용 프로그램이 내 OS에 과도하게 액세스하는 것을 원하지 않으며 어떤 응용 프로그램/사용자도 특정 파일에 액세스하는 것을 원하지 않습니다.
답변1
Unix&Linux에 Andrzej를 환영합니다.
부여하는 권한을 최소화하려면 다음을 권장합니다.
- 전용 그룹을 만듭니다(이름을 지정하겠습니다
drone
).addgroup drone
/dev/ttyUSB0
그룹으로 변경drone
:chgrp drone /dev/ttyUSB0
- 드론 구성 소프트웨어(라고 함
/usr/bin/foo
)를 이 그룹으로 변경drone
하고 이setgid
비트를 활성화합니다.chgrp drone /usr/bin/foo; chmod g+s /usr/bin/foo
other
구성 소프트웨어 실행을 비활성화하고user1
파일 ACL을 사용하여 이를 실행할 수 있는 전용 사용자(우리가 부르는) 권한을 부여하는 옵션이 있습니다 .chmod o-x /usr/bin/foo; setfacl -m u:user1:r-x /usr/bin/foo
sudo
3과 4를 전용 사용자가 그룹으로 구성 소프트웨어를 실행할 수 있도록 허용하는 사용으로 바꿀 수 있습니다 drone
. 다음을 추가할 수 있습니다 /etc/sudoers
.
user1 ALL=(:drone) /usr/bin/foo
그런 다음 다음과 같이 사용하십시오 user1
.sudo -g drone foo
답변2
대답은 Linux 배포판에 따라 다를 수 있습니다.
Unix 초기에는 직렬 회선과 모뎀이 컴퓨터 간의 가장 일반적인 네트워킹 모드였을 때 이메일과 파일 전송은 uucp
Unix-to-Unix-Copy(또는 이메일 전송, 액세스와 같은 경우)라는 방식으로 시스템 간에 예약되었습니다. 나가는 연결에 사용되는 직렬 포트는 일반적으로 uucp
uucp 제품군 이라고 하는 특수 그룹에 할당되며 setgid uucp
프로그램에는 해당 프로그램을 허용하는 권한이 할당됩니다.오직이러한 프로그램에는 나가는 직렬 포트에 액세스하기 위해 루트 권한이 필요하지 않습니다.
일반 사용자는 uucp 제품군의 일부 도구를 실행할 수 있지만 도구 자체에는 장난을 피하기 위해 필요한 검사가 포함됩니다.
분명히 Linux 배포판은 여전히 이 오래된 명명 규칙을 따릅니다. 최신 시스템에서는 실제 uucp
소프트웨어 제품군을 사용할 가능성이 낮으므로 이 uucp
그룹을 사용하여 시스템 소유자가 합리적이라고 판단하는 방식으로 직렬 포트에 대한 액세스를 제어할 수 있습니다. 일부 배포판에서는 관리 직렬 포트와 같은 다른 이름을 가진 그룹을 사용합니다. 그 이유는 dialout
이름이 Unix의 역사를 모르는 사람에게 불투명하고 직관적이지 않기 때문입니다.uucp
uucp
내 생각에 일부 Unix 사양에서는 이 그룹이 호환 가능한 Unix 계열 시스템에서 항상 사전 정의된 시스템 그룹으로 존재해야 한다고 요구(또는 적어도 권장)했던 것 같습니다 .
일부 배포판에는 실제로 Debian 및 관련 배포판에서 특정 사용자가 특정 유형의 장치(예 cdrom
: , , 또는)에 액세스하도록 허용하는 데 사용할 수 있는 사전 정의된 그룹이 많이 있습니다.audio
video
plugdev
scanner
/dev/ttyUSB0
단순한 파일이 아닙니다.장치 노드. 최신 Linux 배포판에서 장치 노드는 udev
RAM 기반 파일 시스템에 의해 관리되고 저장됩니다. 따라서 소유권이나 권한을 사용하거나 변경하는 경우 chmod
해당 chown
변경 chgrp
사항은 재부팅 후에도 유지되지 않습니다.
따라서 몇 가지 옵션이 있습니다.
- 네가 원한다면모든 사용자직렬 포트 사용 기능특정 프로그램에만 사용 가능,
setuid uucp
다음 프로그램에 권한을 추가할 수 있습니다.
sudo chgrp uucp /some/where/Betaflight
sudo chmod g+s /some/where/Betaflight
- 네가 원한다면일부 사용자만직렬 포트를 사용하려면 다음 사용자를
uucp
그룹에 추가하면 됩니다.
sudo usermod -a -G uucp username
참고: 그룹 멤버십은 로그인 시 사용자 세션에 할당되므로 이 변경이 수행될 때 사용자가 이미 로그인되어 있는 경우 변경 사항을 적용하려면 사용자가 로그아웃했다가 다시 로그인해야 합니다.
- 네가 원한다면실제로는 사용자만 컴퓨터에 있습니다.(사용자가 SSH를 통해 원격으로 로그인하는 대신) 직렬 포트
systemd-logind
(사용된 경우) 또는 PAM 모듈에 대한 액세스를 사용하여 실제로 콘솔에 로그인한 사용자에게 장치 노드에 대한 추가 액세스를 제공할 수 있습니다.
이전 배포판에서는 세션 중에 지정된 장치의 소유권을 사용자에게 이전하고 세션이 끝난 후 다시 루트로 돌아가거나 로컬로 로그인할 때 로그인한 사용자에게 추가 그룹 멤버십을 부여함으로써 이를 수행할 수 있었습니다. 최신 구현에서는 devtmpfs
ACL에 대한 파일 시스템 지원이 성숙해지고 일반화됨에 따라 이러한 목적으로 장치에서 ACL(액세스 제어 목록)을 사용하는 경향이 있습니다 .
systemd-logind
를 사용하면 제어 권한이 있는 장치에 대한 udev 규칙을 추가하여 로컬로 로그인한 사용자에게 장치를 할당 할 수 있습니다 .TAG+="seat"