NFS와 보안
NFS는 네트워크에서 파일을 손쉽게 사용하게 만들지만 잠재적으로 보안 문제를 일으킬 가능성을 품고 있다. NFS 버전 3은 유닉스나 리눅스의 보안 문제를 대표적으로 보여주는 예다. 애초에 프로토콜은 보안보다는 편리성을 위주로 설계됐다. 다행히도 요즈음 리눅스는 전통적인 NFS에 따라다니는 보안 문제를 보완하는 몇 가지 해결책을 제공한다.
NFS 볼륨에 접근하려면 /etc/exports 파일 인증을 거쳐야 하는데, 이 파일에는 NFS 서버의 파일 시스템에 접근 권한을 가진 호스트명이 명시돼 있다.불행하게도 이와 같은 방법에 보안 문제가 있는 이유는 자신이 누구라고 말하는 클라이언트를 신뢰해야 하기 때문이다. 클라이언트는 자신의 신원을 위조하기 쉬우므로 이런 방법을 완벽하게 신뢰하기 어렵다.
이런 문제를 막기 위해 서버는 믿을 수 있다고 판단된 클라이언트에게만 파일 시스템을 익스포트해야 하고, 전체 네트워크에 자신의 파일 시스템이 익스포트되지 않았는지 항상 확인을 해야 한다. NFS 포트 접근은 엄격하게 제한해야 한다. 다행히도 모든 버전을 통틀어 리눅스에는 방화벽이라는 해결책이 있다.
NFS은 로컬 파일 시스템과 똑같이 UID나 GID, 파일 접근 권한 등을 사용해서 파일 접근 제어를 한다. 하지만 앞에서도 얘기했듯이 서버는 클라이언트가 신분을 위조해도 확인할 방법이 없다. 예를 들어 메리와 밥이 똑같은 UID를 공유해서 서버에 접근했다면 이들이 서로 다른 클라이언트 시스템에 있더라도 상대방의 NFS 파일을 마음대로 사용할 수 있다.
더 심각한 건 자신의 UID를 마음대로 바꿀 수 있는 루트 권한을 가진 사용자의 경우다. 서버는 아무것도 모른 채 관련된 파일을 내어줄 것이다. 이런 이유로 UID를 전역 네트워크에서 고유한 값으로 부여하고 root_squash 옵션을 사용하게 권장한다.
어떤 이름난 교육기관에서 root_squash를 사용하지 않아 대형 서버 5대와 데스크탑 컴퓨터 60대가 보안 침해를 당한 사태가 벌어졌다. 사소해 보이는 이 사고를 복구하는데 황금연휴를 날렸다고 한다. 네트워크 방화벽이 설치된 시스템이라면 TCP나 UDP의 2049포트는 NFS가 사용하는 포트이므로 접근을 막는 편이 좋다.
TCP나 UDP의 111번포트를 사용하는 portmap데몬에 대한 접근도 제한하는 편이 좋다. 앞의 경고가 암시하고 있지만 다시 한 번 강조하면 NFS 파일 시스템이 로컬에 있지 않은 시스템에 익스포트되거나 인터넷을 통해 네트워크 전체로 익스포트 되지 않게 주의해야 한다.
루트 제어와 노바디 계정
일반적으로 사용자 계정은 권한이 모두 동일하지만 NFS를 마운트한 파일 시스템에서 루트 계정만큼은 함부로 사용하지 못하게 막고 있다. 리눅스 BFS 서버는 UID 0번에서 들어오는 요청을 중간에 가로채서 다른 사용자가 보낸 것처럼 바꿔 버린다. 이를 루트 제압하기 라고 부른다. 루트 계정을 완전히 막아 버리지는 않지만 일반 사용자와 수준이 같은 권한만을 갖게 제한한다.
노바디는 원격의 루트 계정이 NFS 서버를 사용하려고 사용하는 가상의 사용자 계정이다. NFS 서버에서 노바디의 UID는 65534다. 루트에 대한 기본 UID와 GID 값은 anouid와 anogid 익스포트 옵션으로 변경할 수 있다. 또한 all_squash 옵션으로 모든 클라이언트 UID를 서버에서 UID 하나로 사상할 수 있다.
이런 설정은 사용자 간 차이를 없애고 파일 시스템을 공용으로 사용하게 만든다. 반대로 no_root_squash 옵션은 루트 계정의 UID 사상을 차단한다. 이 옵션은 디스크가 없는 클라이언트 시스템에서 루트 권한을 가진 사용자가 서버의 파일을 마음대로 수정할 수도 있으므로 평상시에는 이 기능을 켜놓지 않는 편이 좋다. 그럼에도 불구하고 유용한 옵션임에는 틀림없다.