Skip to content

NetworkFileSystem:Install:Server

NFS 서버 구성 (보안 적용)

리눅스 보안 구성

Linux:Security 항목을 참조.

NFSv4 Only 설치

NFSv4만 사용하면 포트가 2049/tcp 하나로 고정되어 방화벽 관리가 간단해지고 보안적으로 유리하다. v2/v3은 rpcbind 및 여러 동적 포트를 사용하므로 반드시 비활성화한다.

sudo apt install -y nfs-kernel-server

# NFSv4만 허용 (v2, v3 차단) / Enable NFSv4 only
sudo tee /etc/default/nfs-kernel-server << 'EOF'
RPCNFSDCOUNT=8
RPCNFSDPRIORITY=0
RPCMOUNTDOPTS="--manage-gids --no-nfs-version 2 --no-nfs-version 3"
RPCSVCGSSDOPTS=""
RPCNFSDOPTS="-N 2 -N 3"
NEED_SVCGSSD=""
EOF

# rpcbind 비활성화 (NFSv4는 불필요) / Disable rpcbind
sudo systemctl disable --now rpcbind.service rpcbind.socket

NFS 버전

필요 포트

보안 평가

NFSv2/v3

111(rpcbind), 2049, 동적 포트 다수

취약 — 다수 포트 개방 필요

NFSv4

2049/tcp만

권장 — 단일 포트, 방화벽 관리 용이

NFS 공유 디렉토리 생성

NFSv4는 pseudo filesystem 기반으로 동작하므로 별도의 루트 디렉토리를 만들고 bind mount를 사용한다.

# NFSv4 루트 (pseudo filesystem) / Create NFSv4 root
sudo mkdir -p /srv/nfs4
sudo mkdir -p /srv/nfs4/shared
sudo mkdir -p /srv/nfs4/homes

# 실제 데이터 디렉토리를 bind mount / Bind mount data directory
sudo mkdir -p /data/shared
sudo mount --bind /data/shared /srv/nfs4/shared

# fstab에 영구 등록 / Persist in fstab
echo "/data/shared /srv/nfs4/shared none bind 0 0" | sudo tee -a /etc/fstab

/etc/exports 설정 (최소 권한)

Kerberos 환경 (최고 보안)

sudo tee /etc/exports << 'EOF'
# NFSv4 pseudo root
/srv/nfs4        192.168.1.0/24(ro,fsid=0,no_subtree_check,crossmnt,sec=krb5p)

# 공유 디렉토리 - 특정 IP만 허용, root squash 적용
/srv/nfs4/shared 192.168.1.100(rw,sync,no_subtree_check,root_squash,sec=krb5p,anonuid=65534,anongid=65534)
/srv/nfs4/shared 192.168.1.101(ro,sync,no_subtree_check,root_squash,sec=krb5p)
EOF

sec=krb5p가 가장 안전하지만 Kerberos 인프라(KDC)가 별도로 필요하다. 가정 및 소규모 환경에서는 아래 sec=sys + 방화벽 IP 제한 조합이 현실적이다.

=== Kerberos 없이 현실적 보안 극대화 (sec=sys 기준) ===

sudo tee /etc/exports << 'EOF'
/srv/nfs4        192.168.1.0/24(ro,fsid=0,no_subtree_check,crossmnt,sec=sys)

# all_squash로 모든 원격 사용자를 특정 UID로 제한
# Map all remote users to specific UID with all_squash
/srv/nfs4/shared 192.168.1.100(rw,sync,no_subtree_check,all_squash,anonuid=1100,anongid=1100,sec=sys)
EOF

# 전용 NFS 사용자 생성 / Create dedicated NFS user
sudo groupadd -g 1100 nfsuser
sudo useradd -u 1100 -g 1100 -s /usr/sbin/nologin -d /nonexistent nfsuser

# 디렉토리 권한 설정 / Set directory permissions
sudo chown -R nfsuser:nfsuser /data/shared
sudo chmod 770 /data/shared

sudo exportfs -ra

exports 보안 옵션 상세

옵션

설명

보안 수준

root_squash

클라이언트의 root를 nobody로 매핑 (기본값)

기본 보안

all_squash

모든 원격 사용자를 nobody(또는 지정 UID)로 매핑

강화

sync

쓰기 완료 후 응답 (데이터 무결성 보장)

데이터 안전

no_subtree_check

성능+안정성 향상 (subtree_check는 race condition 이슈 있음)

권장

sec=krb5p

Kerberos 인증 + 데이터 암호화

최고

sec=krb5i

Kerberos 인증 + 무결성 검증

높음

sec=krb5

Kerberos 인증만

중간

sec=sys

시스템 UID/GID 기반 인증

기본

anonuid / anongid

squash된 사용자의 UID/GID 지정

제어

방화벽에 NFS 규칙 추가

클라이언트 IP 단위로만 허용하고, 절대 전체 네트워크에 열지 않는다.

# NFSv4는 2049/tcp만 필요 / NFSv4 requires only 2049/tcp
sudo ufw allow from 192.168.1.100 to any port 2049 proto tcp comment 'NFS-client1'
sudo ufw allow from 192.168.1.101 to any port 2049 proto tcp comment 'NFS-client2'

# 규칙 확인 / Verify rules
sudo ufw status numbered

NFS 서버 시작 및 확인

sudo systemctl enable --now nfs-server

# 내보내기 확인 / Verify exports
sudo exportfs -v

# 포트 확인 / Verify port
sudo ss -tlnp | grep 2049

See also