본문 바로가기
시스템운영

NFS Network File System

by 보이드메인 2024. 2. 6.

NFS (Network File System)은 썬 마이크로 시스템(SUN)에서 네트워크를 통해 파일을 공유할 수 있도록 만든 프로토콜 이다. NFS는 하드웨어, 운영체제 또는 네트워크 구조가 달라도 파일을 공유 할 수 있도록 고안되었다. 파일 공유등을 비롯해 다른 부가 기능을 제공한다. 하지만 공유된 파일들에 대한 보안 문제가 생길 수도 있다. 사용하는 프로토콜은 Network Lock Manager (NLM)과 Network Status Monitor (NSM)이다.

 

기능상 Samba와 비슷하지만 가장 큰 차이는 커널에서 NFS를 지원한다는 점이다.

NFS는 리눅스머신에서 윈도우 파티션을 마운트하여 사용하듯 NFS서버의 특정 디렉토리를 클라이언트에서 마운트하여 자신의 영역인것처럼 사용한다.

그러나 위와 같은 편리한 점에도 불구하고 보안상 많은 취약점을 드러내고 있다. 가장 단적인 예로 클라이언트인양 속여서 서버에 접속하게 되면 특정 디렉토리를 마음대로 조작할 수 있는 단점이 있다.

NFS는 스토리지가 고가였던 시절 디스크가 없는 시스템을 지원하기 위하여 개발되었으나 스토리지 및 컴퓨터의 성능이 좋아지면서 파일 공유 및 파일 서버를 위한 방법으로 사용되고 있다.

 

NFS 선행조건

기본적으로 커널에서 지원을 해주어야 한다. 물론 최근에 나오는 리눅스 배포판들은 이미 지원이 되고 있으므로, 아무런 걱정없이 NFS를 사용할 수 있다.

portmap 설치역시 NFS를 사용하기 위해서 필수적인 프로그램이다. portmap은 포트요청이 있을 때 새로운 포트를 할당해주고 맵핑해주는 역할을 하게 된다. 즉, NFS에 접근한 시스템이 있으면 NFS 포트에서는 인증을 하고 파일을 주고 받는 포트는 새로운 포트를 할당을 하게 되는 것이다.

NFS는 웹서버나 FTP 서버와는 다르게 데몬 프로세스가 특정 네트워크 포트를 점유하면서 동작하여 접속을 대기하고 있는 것이 아니라 portmapper 라는 프로그램을 이용해서 네트워크 포트를 할당 받는다. portmapper는 111번 포트를 점유하면서 데몬 상태로 대기하고 있다가 NFS 서비스를 요구하는 접속이 들어오면 nfsd(또는 rpc.nfsd)에게 포트 번호를 바꾸어 접속을 연결시켜 준다.

 

NFS서버 구성

서버의 구성의 예를 보면 다음과 같다.

구분   서버   클라이언트
호스트명   mmx   ns
용도   NFS 서버   NFS 클라이언트
공유 디렉토리   /data   /nfs
Ip   192.168.0.2   192.168.0.4

mmx에서는 data라는 디렉토리를 공유시키고, ns에서는 nfs라는 이름으로 data 디렉토리를 마운트시킬 것이다. 그러면, 다음과 같은 구성을 하는데 있어 필요한 사항들에 대해 알아보도록 하자. 현재 mmx의 data 디렉토리에는 다음과 같은 파일이 있으며, /etc/exports에는 해당 디렉토리를 서비스하도록 설정되어 있다.

ex) [root@mmx /] cat /etc/exports

 

 mountd

클라이언트로부터의 마운트 요청을 처리하는 데몬으로 /etc/exports의 내용을 읽어 어떤 호스트에게 마운트를 허가하고 어떤 제한을 주어야 하는지 판단하게 된다.

[root@mmx /etc]# cat exports
/data 192.168.0.*(rw)
[root@mmx /etc]#

exports파일은 마운트될 디렉토리와 허가 대상, 제한을 명시하며 또한 NFS클라이언트는 서버의 exports파일을 사용하기 이전에 명확하게 허가된 파일 또는 디렉토리를 마운트 해야 한다. 서버에서는 마운트를 허가해주기 이전에 인증을 거쳐 올바른 사용자인지를 판단하며 이를 masic cookie라고 합니다.

리눅스는 BSD와 비슷한 동작을 취하게 되는데, 그 동작은 mountd는 클라이언트의 요청이 있으면 /etc/exports의 내용을 읽어 호스트에 접속을 허가하고 디렉토리에 제한을 두게 되는 것이다.

 

 

 /etc/exports

exports의 설정은 라인단위로 처리하게 됩니다. 즉 하나의 라인이 하나의 디렉토리 공유를 표시하게 됩니다. 다음은 각 필드별 설명이다.

첫 번째 필드 : 제공할 디렉토리의 절대 경로입니다. 위의 예제에서는 /data가 된다.
두 번째 필드 : 허가할 사용자 목록(속성)으로 위의 예제에서는 192.168.0.에 속해 있는 모든 호스트에게 허용하게 된다.

허가할 사용자 목록 형식은 다음과 같습니다.

호스트 네임 형식 : mmx ns2
도메인 네임 형식 : *.zero.com
주소 형식 : 192.168.1.*

마지막으로 ()에 묶여있는 속성이다.

속성에는 다양한 설정을 부여할 수 있으며, 보안에 매우 민감한 사항이므로 항상 유의하여야 한다.

 

속 성 기 능
ro 읽기전용
rw 읽기 / 쓰기 가능
root=n n으로 표시된 계정의 UID를 루트권한으로 사용 가능하게 한다.
Insecure 이 머신에서 인증 받지 않은 억세스를 허용한다.
Unix-rpc 이 머신에서 UNIX-도메인 RPC 인증절차를 요구한다. 이것은 단순히 예약된 인터넷 포트에서 일어나는 request를 필요로한다. (즉, 포트번호는 1024 아래여야 한다.) 이 옵션은 디폴트로 켜져있다.
secure-rpc 이 머신에서 secure RPC 인증절차를 요구한다. 이것은 아직 수행되지 않는다. Secure RPC에 관한 Sun의 문서를 보라.
Kerberos 이 머신에서의 억세스에 kerberos 인증절차를 요구한다. 이것 역시 아직 수행되지 않는다. Kerberos 인증 시스템에 관한 MIT의 문서를 보라.
root_squash 이것은 클라이언트 호스트의 uid 0에서의 request를 서버의 uid 65534(-2)로 매핑함으로써, 지정된 호스트의 슈퍼 유저의 억세스를 거부하는 보안기능이다. uid 65534는 유저 nobody의 것이다.
no_root_squash uid 0으로부터의 request를 매핑하지 않는다. 이것은 디폴트로 켜져있다.
link_relative 절대 심볼릭 링크(링크의 내용이 슬래쉬로 시작하는)를, 링크를 포함하는 디렉토리에서 서버의 루트 디렉토리까지 필요한 수 만큼의 ../를 앞에 붙여 상대 링크로 변환한다. 이 옵션은 오직 호스트의 전체 파일 시스템을 마운트 할 때만 쓸만한 것이지, 그렇지 않을 경우 어떤 링크는 어느 곳도 지시하지 않을 수 있고, 심하면 가리키려 의도하지 않던 파일을 지시하는 수도 있다. 이 옵션은 디폴트로 켜져있다.
link_absolute 모든 심볼릭 링크를 그대로 놔둔다. (Sun에서 제공하는 NFS 서버에선 보통의 동작방식이다).
map_identity map_identity 클라이언트가 서버와 동일한 uid와 gid를 사용한다고 가정하라고 서버에게 말해준다. 이 옵션은 디폴트로 켜져 있다.
map_daemon 이 옵션은 NFS 서버에게 클라이언트와 서버가 동일한 uid/gid를 공유하지 않음을 가정하라고 말한다. 그러면 nfsd는 클라이언트의 ugidd 데몬에 쿼리하여 클라이언트와 서버간의 id를 매핑한 목록을 생성한다.

위의 예제에서는 (ro)속성만을 주었다.

이제는 NFS서버에 해당 사항을 전달해주어야 한다. 명령어 exportfs  실행해 주어야 NFS가 동작한다.

만약 exports에 공유에 관한 설정이 존재하지 않느다면 NFS데몬은 정상적으로 설치되어있어도 동작하지 않는다.

 

그리고 확실하게 하기 위해 NFS데몬을 재기동 한다.

 

ex) [root@mmx /root]# exportfs

/data 192.168.0.*

 

[root@mmx /root]# /etc/rc.d/init.d/nfs restart

done.rting NFS services: rpc.mountd [OK]

 

NFS 테스트

NFS테스트는 자기자신을 마운트해봄으로써 확인할 수 있다.

mount명령을 통해 마운트를 하였을 때 아무런 메시지가 표시되지 않는다면 성공한 것이다.

명령은 다음과 같다.

# mount -t nfs 호스트명(혹은 ip):/공유디렉토리 /마운트포인트

ex) [root@nmx /root]# mount -t nfs 192.168.0.0:/data /root/nfs

일반적으로 성공하지 못하는 경우는 nfs에 관련된 데몬(portmap, nfsd, mountd)에 문제가 발생하였다고 볼 수 있다.

이 경우에는 각 데몬들이 제대로 동작하는지 먼저 체크하도록 한다.

 

NFS 클라이언트

nfs 마운트 형식은 위의 형식을 그대로 사용해도 되며, 만일, 부팅시 마운트를 시키려고 한다면 /etc/fstab에 등록함으로써 가능하다. 일반적으로 하드디스크가 필요없는 시스템을 구축하는 경우에도 바로 파일시스템 자체를 NFS로 구성하는 것이 가능하다. 즉 부팅과 동시에 NFS데몬이 가동되면서 네트워크에 있는 하드디스크를 자신의 하드디스크 인것처럼 NFS를 사용해 공유하는 것이다.

 

mount를 이용할 경우

mmx의 data디렉토리를 ns에서 /nfs라는 디렉토리로 마운트 시킬 경우 다음과 같은 명령으로 마운트시킬 수 있다.

ex) [root@ns /root]# mount -t nfs 192.168.0.2:/data/nfs

# mount -t nfs 192.168.0.2:/data /nfs

만일 부팅때부터 마운트되도록 하려면 /etc/fstab 파일을 수정해야 하는데 기본적인 내용을 살펴보면

다음과 같다.

LABEL=/ / ext2 defaults 1 1
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner 0 0
none /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
/dev/hda5 swap swap defaults 0 0

 

다음의 내용에 추가하면 되고, 추가하는 형식은 다음과 같다.

호스트명(ip주소):/공유디렉토리 /마운트포인트 nfs(파일시스템) 옵션 덤프 점검여부

실제적으로 적용시 내용은 다음과 같습니다.

192.168.0.2:/data /nfs nfs bg,soft,rw 0 0

위의 내용은 192.168.0.2의 data디렉토리를 /nfs디렉토리로 마운트 하되 파일시스템은 nfs이며 백그라운드로, 소프트타입으로, 읽기쓰기가 가능하도록하며 부팅시 파일시스템 점검은 하지않도록 설정한 것이다.

마운트 옵션을 살펴보면 다음과 같다.

옵 션 기 능
suid, nosuid 보안상 원격파일 시스템에서 suid모드보다는 nosuid모드가 권장된다.
Bg nfs 마운트가 처음에 실패할 경우 백그라운드 상태에서 계속 시도하게 되는 것으로 원격파일시스템이 허용되지 않을 경우 부트 시간을 단축시킨다.
Retry=n 포기할 때가지의 마운트 시도횟수로 기본은 100000이다.
timeo=n 타임아웃 시간을 설정한다.
retrans=n n번 요구를 재전송하는 것으로 기본은 3번이다.
soft,hard 재시도 횟수가 끝이 났을 때 연결을 계속할지 말지를 결정한다. 읽기전용으로 마운트될 경우엔 soft가, 읽기/쓰기가 가능하도록 마운트될 경우엔 hard가 적합하다. soft로 마운트된 파일시스템은 프로세스가 멈추어지는 문제를 피할 수도 있다.
Intr 정지 프로세서를 죽이기 위한 인터럽트를 허용한다. 터미널에 대해 CTRL-C를 누르고 백그라운드 프로세스인 경우 INT(2) 혹은 QUIT(3) 신호를 보내면 다시 동작된다.
resize=n nfs서버에 있는 읽기 버퍼의 크기(바이트단위)
wsize=n
nfs서버에 있는 쓰기 버퍼의 크기(바이트단위)

 

마운트정보

 

마운트 정보를 보기 위해서는 다음과 같이 showmount로 확인할 수 있습니다.현재 192.168.0.2에 NFS로 접속한 호스트는 자기 자신과 192.168.0.4번이라는 것을 확인할 수 있다.

 

[root@ns /root]# showmount 192.168.0.2
Hosts on 192.168.0.2:
192.168.0.2
192.168.0.4
[root@ns /root]#

 

마운트의 해제

마운트의 해제는 umount 명령으로 해당 마운트 포인트를 지정함으로써 해제할 수 있다.

 

 

 

댓글