Linux에서 Landlock 적용
Source: Hacker News
Landlock‑Ing Linux
Landlock: 무엇인가?
Landlock은 애플리케이션이 접근을 허용할 리소스를 명시적으로 선언할 수 있게 해 주는 Linux API입니다. 그 철학은 OpenBSD의 unveil()과(덜은) pledge()와 비슷합니다: 프로그램이 커널에 “나는 이 파일이나 리소스만 필요하니, 나머지는 차단해 주세요—만약 내가 침해당하면 모든 것을 거부해 주세요”라는 계약을 맺는 것이죠.
이는 개발자 친화적인 방식으로 애플리케이션에 방어‑깊이를 추가할 수 있게 해 줍니다. 기존의 Linux 보안 메커니즘에 비해 Landlock은 이해하고 통합하기가 훨씬 쉽습니다.
어떻게 동작하나요?
Landlock은 Linux 5.13부터 제공되는 Linux Security Module (LSM)입니다. SELinux나 AppArmor 같은 MAC 프레임워크와 달리 Landlock은 일시적인 제한을 적용합니다:
- 정책은 런타임에 생성됩니다.
- 현재 스레드와 그 이후에 생성되는 자식 스레드·프로세스에 적용됩니다.
- 프로세스가 종료되면 정책도 사라집니다.
파일에 라벨이나 확장 속성을 붙이지 않습니다. 대신 애플리케이션이 동적으로 정책을 생성합니다.
Landlock 정책은 두 부분으로 구성됩니다:
- 핸들링할 접근 – 제한하고 싶은 작업 종류(예: 파일 시스템 읽기/쓰기).
- 접근 허용 – 해당 작업에 대해 허용할 객체들의 명시적 허용 목록.
예시 정책
- 핸들 모든 파일 시스템 읽기/쓰기와 네트워크 바인드.
- 허용:
/home/user에 대한 읽기 전용 접근/tmp에 대한 읽기/쓰기 접근- 포트
2222에 바인드할 권한
애플리케이션은 이후 landlock_restrict_self()를 호출해 제한된 영역에 진입합니다. 그 시점부터 스레드의 자식 스레드와 자식 프로세스는 영구적으로 제한되며, 제한을 해제할 수 없습니다.
- 계층화 – 최대 16계층. 자식 계층은 접근을 더 줄일 수 있지만, 부모가 제거한 권한을 다시 부여할 수는 없습니다.
- 비특권 – 어떤 애플리케이션도 스스로 샌드박스를 만들 수 있습니다.
- ABI 버전 관리 – 프로그램은 오래된 커널에서도 최선의 샌드박싱을 적용할 수 있습니다.
- 스택 가능한 LSM – SELinux나 AppArmor와 함께 사용할 수 있습니다.
왜 사용해야 할까요?
Landlock은 애플리케이션이 필요로 하는 파일이나 디렉터리 집합이 예측 가능한 경우에 빛을 발합니다. 예를 들어, 웹 서버는 자신을 /var/www/html와 /tmp에만 제한할 수 있습니다.
- 관리자 개입이나 시스템 전체 설정이 필요 없습니다.
- 정책이 애플리케이션 코드에 직접 포함됩니다.
- 특별한 권한이 필요 없으므로 도입이 간단합니다.
- Rust, Go, Haskell 등용 언어 바인딩이 존재합니다(공식 C 라이브러리는 아직 없습니다).
Rust 예시
use landlock::{
ABI, AccessFs, Ruleset, RulesetAttr, RulesetCreatedAttr, RulesetStatus, RulesetError,
path_beneath_rules,
};
fn restrict_thread() -> Result<(), RulesetError> {
let abi = ABI::V1;
let status = Ruleset::default()
.handle_access(AccessFs::from_all(abi))?
.create()?
// Read‑only access to /usr, /etc and /dev.
.add_rules(path_beneath_rules(&["/usr", "/etc", "/dev"], AccessFs::from_read(abi)))?
// Read‑write access to /home and /tmp.
.add_rules(path_beneath_rules(&["/home", "/tmp"], AccessFs::from_all(abi)))?
.restrict_self()?;
match status.ruleset {
RulesetStatus::FullyEnforced => println!("Fully sandboxed."),
RulesetStatus::PartiallyEnforced => println!("Partially sandboxed."),
RulesetStatus::NotEnforced => println!("Not sandboxed! Please update your kernel."),
}
Ok(())
}
Linux 샌드박싱 현황: 왜 중요한가
Linux 채택이 늘어나면서 데스크톱 사용자를 노린 악성코드도 증가하고 있습니다. Linux가 역사적으로 비교적 안전했던 이유는 시장 점유율과 기술적 장벽 때문이지, 본질적인 보안 때문은 아닙니다.
주요 배포판에서 흔히 볼 수 있는 위험 요소:
- 사용자가 경고 없이 신뢰하지 않은 바이너리를 실행할 수 있다.
- 쉘 스크립트를 인터넷에서 파이프해 그대로 실행할 수 있다.
- 비밀번호 없이
sudo를 사용하는 경우가 많아, 필요 시 즉시 root 권한을 얻는다.
비특권 애플리케이션은 보통 다음을 할 수 있습니다:
$HOME파일(~/.ssh,~/.bashrc, 브라우저 쿠키 등) 읽기- 환경 변수와
$PATH수정 - systemd 사용자 서비스 생성
- (X11 환경) 키 입력을 기록하고 입력 장치 읽기
- 임의의 네트워크 포트에 바인드
기존 샌드박싱 접근 방식
| 접근 방식 | 장점 | 단점 |
|---|---|---|
| 컨테이너화 (Docker, Podman) | 서비스에 대한 강력한 격리 | 데스크톱 앱에 부적합; 홈 디렉터리 접근이 번거로움; --privileged 사용 시 격리 무효 |
| Flatpak / Snap | 그래픽 앱에 적합 | 과도하게 넓은 권한을 요구하는 경우가 많으며, CLI 도구에는 부적합 |
| Firejail | 애플리케이션별 프로파일 제공 | 명시적 호출이나 래퍼 스크립트가 필요 |
| seccomp | 시스템 콜을 세밀하게 필터링 | 번거롭고 오류가 발생하기 쉬움; 블랙리스트는 깨지기 쉬우며 TOCTOU 위험 존재 |
| SELinux | 매우 강력함 | 복잡하고 관리자 정책 필요, 데스크톱에서는 종종 비활성화 |
| AppArmor | SELinux보다 쉬움 | 여전히 관리자 정의, 시스템 전체 적용, 때때로 비활성화 |
| Landlock | 비특권, 애플리케이션 중심, 통합 쉬움, 기본 거부, 5.13부터 지원, 전후 호환 | 아직 성숙 단계; 공식 C 라이브러리 부재 |
Landlock은 간단하고 자체 포함된 비특권 샌드박싱 도구라는 큰 공백을 메워줍니다.
Landlock이 가져올 수 있는 변화
- 시스템 데몬은 실제로 필요한 파일만 접근하도록 제한될 수 있다.
- 데스크톱 애플리케이션(PDF 뷰어, 이미지 뷰어, 브라우저, 워드 프로세서 등)은 열어본 파일에만 접근하도록 제한될 수 있다.
- 서버(FTP, HTTP)는 필요한 리소스에만 바인드될 수 있어, 침해당하더라도 공격자가 임의의 파일을 읽을 수 없게 된다.
- 미래의 슈퍼바이저 모드는 Android 스타일의 권한 프롬프트를 제공해 사용자가 접근을 허용하거나 거부할 수 있게 할 수 있다.
- GUI와 권한 관리자를 결합하면 Landlock은 데스크톱 보안을 크게 향상시킬 수 있다.
Landlock에서 진행 중인 작업
- Supervise Mode – 사용자 공간 “슈퍼바이저”가 인터랙티브하게 접근을 허용하거나 거부하도록 함(Android 권한 프롬프트와 유사).
- Socket Restrictions – 소켓 종류와 포트에 대한 세밀한 제어.
- LANDLOCK_RESTRICT_SELF_TSYNC – 스레드 간 동기화된 제한을 위한 향후 커널 기능.
이러한 개발은 Landlock을 더욱 다재다능하고 사용자 친화적인 샌드박싱 솔루션으로 만들기 위한 것입니다.