/etc/fstab에 마운트를 바인딩하고 하위 디렉터리에 suid를 추가합니다.

/etc/fstab에 마운트를 바인딩하고 하위 디렉터리에 suid를 추가합니다.

나는 이 작업을 수행하기 위해 성공적으로 마운트를 사용했습니다.

sudo mount -o bind dir dir && 
sudo mount -o remount,bind,suid dir

두 번의 호출이 필요합니다 mount. 더 짧은 시간 안에 작업을 수행할 수는 없습니다. 어쨌든 매뉴얼에는 두 번의 마운트 시스템 호출이 필요하다고 나와 있습니다. 하지만, 무엇을 넣어야 할지 모르겠습니다 /etc/fstab.

내가 시도한 것은 다음과 같습니다.

/home/system/dir /home/system/dir none bind
/home/system/dir /home/system/dir none remount,bind,suid

그리고

/home/system/dir /home/system/dir none remount,bind,suid

답변1

바인드 마운트의 예상 동작을 트리거하기 위해 단일 항목을 사용하는 구문 해결 방법을 생각해 냈습니다 /etc/fstab. 그렇지 않으면 for는 트리거되지 않습니다 suid(그러나 for는 트리거됩니다 nosuid). 참을성이 없다면 답변의 마지막 줄로 바로 가셔도 됩니다.

  • /etc/fstab통과체계시작 시 및 통해앞으로는 중복 항목이 지원되지 않습니다.

    체계각 항목을 설치 단위로 변환합니다. 같은 이름을 가진 두 개의 유닛이 있으면 문제가 발생할 것 같습니다.자체적으로 동일한 문제가 있을 수 있습니다. 동일한 이름을 가진 두 항목을 구별할 방법이 없으므로 /etc/fstab첫 번째 항목만 있을 수 있지만 어쨌든 다른 동작을 기대할 수 있습니다.

    따라서 다음 방법으로 이 문제를 처리해 보십시오.입학은 /etc/fstab어려울 것 같습니다.

  • 이것명령(혼자서 또는 함께체계) 반대의 경우만 잘 처리한다.

    "부정적" 옵션(예: nosuid바인드 마운트)을 지정할 때 가장 최근 옵션이면 충분합니다.명령(또는체계그렇지 않은 경우) 올바르게 두 개를 방출합니다.mount(2)시스템 호출 중 두 번째 호출은 추가 MS_REMOUNT플래그를 사용합니다. "긍정적" 옵션만 지정된 경우(시스템 호출에서 누락된 플래그로 변환됨) 이전 "부정적" 옵션을 복원하려는 의도가 있더라도 단일 마운트 시스템 호출이 실행됩니다.

    예를 들어 두 시스템 호출의 동작을 트리거하는 다른 옵션을 지정하면 bind,nodev추가 "공격적인" 옵션(예: suidwith bind,nodev,suid)도 두 번째 마운트 시스템 호출에서 시작됩니다(반대 플래그가 없기 때문에). suid이것은 strace 예제에서 잘 작동합니다 .

    743790 mount("/home/system/dir", "/home/system/dir", 0x563792444220, MS_NODEV|MS_BIND, NULL) = 0
    743790 mount("none", "/home/system/dir", NULL, MS_NODEV|MS_REMOUNT|MS_BIND, NULL) = 0
    

    누락된 MS_NOSUID존재 MS_REMOUNT로 인해 마운트 지점이 로 설정됩니다 suid. 이는 또한 상위 마운트에 설정된 다른 모든 기본 옵션이 연결된 바인드 마운트에 대해 명시적으로 다시 작성되어야 함을 의미합니다. 그렇지 않으면 해당 옵션은 사라집니다. 여기에 옵션을 지정하지 않으면 suid바인드 마운트가 다시 마운트됩니다.수에이드MS_NOSUID두 경우 모두 두 번째 마운트 시스템 호출에서 플래그가 누락되어 발생하기 때문입니다. 두 번째 시스템 호출을 트리거하는 옵션은 여전히 ​​존재해야 하며, 그렇지 않으면 전혀 실행되지 않습니다.

OP의 의도는 이곳에서 루트 없는 컨테이너를 실행하는 것이라고 추측하므로 이 동작을 계속 실행하려면 무해한 옵션을 사용해야 합니다. 내가 찾을 수 있는 유일한 후보자mount(2)was MS_NOATIME또는 MS_NODIRATIMEand MS_RELATIME, 마지막 것은 오늘의 기본값이며 확실히 이미 존재합니다.

Linux 2.4부터 위의 일부플래그는 설치별로 설정할 수 있습니다., 다른 것들은 마운트된 파일 시스템의 슈퍼블록에 적용됩니다. 즉, 동일한 파일 시스템의 모든 마운트가 이러한 플래그를 공유한다는 의미입니다. (이전에는 모든 플래그가 슈퍼블록별로 이루어졌습니다.)

이것각 장착 지점 표시아래에 명시된 바와 같이:

  • Linux 2.4부터: MS_NODEV및 플래그 MS_NOEXECMS_NOSUID마운트 지점별로 설정할 수 있습니다.
  • 또한 Linux 2.6.16부터: MS_NOATIMEMS_NODIRATIME.
  • 또한 Linux 2.6.20부터: MS_RELATIME.

[...]

Linux 2.6.16부터 MS_RDONLY슈퍼블록은 기본 파일 시스템뿐만 아니라 마운트 지점별로 설정하거나 지울 수 있습니다.

[...]

따라서 오늘 실행된 항목의 궁극적으로 예상되는 효과는 다음과 같습니다.

/home/system/dir    /home/system/dir    none    bind,relatime   0 0

단순히 다시 설정 relatime하면 두 번째 마운트 syscall이 트리거되고 변경이 다시 허용됩니다 suid. 이 경우 /home플래그가 있으면 rw,nosuid,relatime평소 대로 처리된다는 /home/system/dir플래그가 있습니다.rw,relatime설정값바이너리, 다른 것은 변경되지 않았습니다.

suid그러나 일관성, 문서화/이해를 위해 그리고 향후 변경/개선을 방지하려면 의도된 목적을 명확하게 명시하는 것이 가장 좋습니다 .

/home/system/dir    /home/system/dir    none    bind,relatime,suid  0 0

관련 정보