특정 사용자(예: 그룹 구성원)의 마운트를 허용할 수 있습니까?어느슈퍼유저 권한이 없는 Linux의 파일 시스템이 있습니까?
또 다른 질문은 "사용자가 파일 시스템을 마운트하여 어떤 방식으로 시스템을 손상시킬 수 있습니까?"일 수 있습니다.
답변1
여러 가지 방법이 있는데 그 중 일부는 대부분 안전하고 일부는 전혀 안전하지 않습니다.
안전하지 않은 방법
mount
예를 들어 sudo를 통해 누구나 run 을 사용할 수 있습니다 . 당신은 그들에게 뿌리를 내릴 수도 있습니다. 그것은 같은 것입니다. 사용자는 bash
루트 권한을 즉시 제공하는 --running의 suid 루트 복사본을 사용하여 파일 시스템을 마운트할 수 있습니다(실행 중이라는 사실을 제외하면 로깅이 없을 수 있음 mount
).
/etc
또는 사용자는 자신의 파일 시스템이나 복사본을 포함하는 자신의 파일 시스템을 그 위에 마운트한 /etc/shadow
다음 /etc/sudoers
루트 권한을 사용하거나 얻을 수 있습니다. 아니면 이 두 파일 중 하나를 바인드 설치( )할 수도 있습니다. 아니면 새 파일을 .su
sudo
mount --bind
/etc/sudoers.d
/etc/pam.d
유사한 공격은 다른 많은 곳에서도 수행될 수 있습니다.
파일 시스템이 장치에 있을 필요도 없으며 -o loop
사용자가 소유한(따라서 수정 가능한) 파일이 마운트된다는 점을 기억하십시오.
가장 안전한 방법: udisk 또는 이와 유사한 방법
실제로 다양한 데스크탑 환경에서는 사용자가 이동식 미디어를 마운트할 수 있도록 하는 솔루션을 구축했습니다. 작동 방식은 only 하위 디렉토리에 설치되고 /media
커널 옵션을 통해 set-user/group-id 지원이 꺼지는 것입니다. 여기에 있는 옵션에는 udisks
, udisks2
, pmount
, usbmount
,
필요한 경우 비슷한 작업을 수행하고 sudo를 통해 호출하는 스크립트를 직접 작성할 수 있지만 루트 취약점을 남기지 않도록 이 스크립트를 매우 주의 깊게 작성해야 합니다. 사용자가 sudo를 기억하지 못하도록 하려면 스크립트에서 다음을 수행할 수 있습니다.
#!/bin/bash
if [ $UID -ne 0 ]; then # or `id -u`
exec sudo -- "$0" "$@"
fi
# rest of script goes here
하루에 안전한 방법: 사용자 네임스페이스
Linux 네임스페이스는 매우 가벼운 형태의 가상화입니다(구체적으로는 컨테이너). 특히 사용자 네임스페이스의 경우어느시스템의 사용자는 자신의 환경을 만들고 그 안에서 루트로 실행할 수 있습니다. 이를 통해 파일 시스템을 마운트할 수 있지만 일부 가상 파일 시스템을 제외하고 파일 시스템은 명시적으로 차단됩니다. 결국 FUSE 파일 시스템이 허용될 수도 있지만내가 찾을 수 있는 최신 패치블록 장치는 포함되지 않으며 sshfs와 같은 것만 포함됩니다.
추가적으로, 많은 배포 커널은 (보안상의 이유로) 권한이 없는 사용자가 기본적으로 사용자 네임스페이스를 사용하는 것을 허용하지 않습니다.더반기본값 kernel.unprivileged_userns_clone
은 0입니다. 다른 배포판도 비슷한 설정을 갖고 있으며 이름이 약간 다른 경우가 많습니다.
사용자 네임스페이스에 관해 내가 아는 최고의 문서는 LWN 기사입니다. 실제 네임스페이스, 5부: 사용자 네임스페이스.
지금은 udisks2를 선택하겠습니다.
답변2
이렇게 할 수 있지만 마운트하려는 파일 시스템에 해당하는 항목을 수정하고 /etc/fstab
해당 항목에 플래그를 추가해야 합니다. user
그러면 권한이 없는 사용자가 설치할 수 있습니다.
바라보다man mount
자세한 내용은.
답변3
여기구성된 위키입니까?폴킷규칙우데카/우데카2루트가 아닌(예: 사용자) 그룹을 통해 파티션을 마운트하려는 경우.
아래 코드를 다음 위치에 저장하세요./etc/polkit-1/rules.d/50-udisks.rules
polkit.addRule(function(action, subject) {
var YES = polkit.Result.YES;
var permission = {
// only required for udisks1:
"org.freedesktop.udisks.filesystem-mount": YES,
"org.freedesktop.udisks.filesystem-mount-system-internal": YES,
"org.freedesktop.udisks.luks-unlock": YES,
"org.freedesktop.udisks.drive-eject": YES,
"org.freedesktop.udisks.drive-detach": YES,
// only required for udisks2:
"org.freedesktop.udisks2.filesystem-mount": YES,
"org.freedesktop.udisks2.filesystem-mount-system": YES,
"org.freedesktop.udisks2.encrypted-unlock": YES,
"org.freedesktop.udisks2.eject-media": YES,
"org.freedesktop.udisks2.power-off-drive": YES,
// required for udisks2 if using udiskie from another seat (e.g. systemd):
"org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
"org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
"org.freedesktop.udisks2.eject-media-other-seat": YES,
"org.freedesktop.udisks2.power-off-drive-other-seat": YES
};
if (subject.isInGroup("users")) {
return permission[action.id];
}
});
"users" 그룹에 있다고 가정하고 다음 명령을 사용하여 파티션을 마운트합니다(sudo가 필요하지 않음).
# udisks2
udisksctl mount --block-device /dev/sda1
# udisks
udisks --mount /dev/sda1
답변4
sudo
사용자 그룹이 명령을 실행할 수 있도록 구성할 수 있습니다 mount
.
고쳐 쓰다: 설치로 인해 시스템이 손상되는 방법은 무엇입니까? 예를 들어 파일 시스템에 setuid 루트 셸을 만든 다음 셸을 마운트하고 실행하여 루트 권한을 얻을 수 있습니다.