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
- NFS
- Security
- Ubuntu
- Linux
- Linux:Security
- NetworkFileSystem:Install:Server - NFS 서버 설치
- NetworkFileSystem:Install:Client - NFS 클라이언트 설치
- NetworkFileSystem:Security