서버·클라이언트 sudo 권한, 유지 중인 SSH 세션과 각 호스트의 콘솔 복구 경로
NETWORK STORAGE · 설치·설정 레시피
NFS 서버·클라이언트 안전 구성
Ubuntu NFS 서버에 전용 공유 경로와 일관된 UID/GID 권한을 구성하고, export를 클라이언트 CIDR로 제한해 root squashing을 유지합니다. 임시 NFSv4 마운트와 쓰기를 검증한 뒤에만 fstab 자동 마운트를 반영합니다.BEFORE YOU START
시작 전에 준비하세요
고정 사설 DNS·서버 사설 IP·정확한 클라이언트 CIDR과 상위 ACL
공유 데이터의 소유 팀·백업·복원 시험과 합의된 <SHARED_GID>
신뢰 경계 밖 네트워크라면 sec=sys 대신 Kerberos krb5p를 설계할 수 있는 KDC·DNS·시간 동기화
권장 대상 사설망 애플리케이션 서버 사이에 파일을 공유하고 권한·자동 마운트·복구까지 안전하게 구성하려는 운영자
FOLLOW THE RECIPE
8단계 구성·점검 레시피
서버·클라이언트 환경과 ID 체계 확인
NFS의 기본 sec=sys 권한은 숫자 UID/GID에 의존합니다. 서버와 모든 클라이언트의 운영체제·NFS 지원·사용자 ID를 먼저 대조합니다.
cat /etc/os-release
uname -rgrep nfs /proc/filesystems
modinfo nfsdid <NFS_APP_USER>
getent group <SHARED_GID>id <NFS_APP_USER>
getent group <SHARED_GID>이 명령은 각 클라이언트에서 실행합니다.- 서버와 클라이언트가 지원 중인 Ubuntu LTS다.
- 동일한 업무 사용자가 모든 호스트에서 합의된 숫자 GID를 사용한다.
- 클라이언트 CIDR이 넓은 사내 전체망이 아니라 실제 소비 호스트 범위다.
이름이 같아도 숫자 UID/GID가 다르면 소유권이 엉뚱하게 보입니다. 디렉터리를 과도하게 개방하지 말고 ID 체계를 먼저 맞춥니다.
기존 export·마운트·포트·공유 경로 데이터를 점검합니다.
기존 export·마운트·데이터 사전 점검
기존 NFS 서비스와 export를 기록하고 공유 경로가 올바른 전용 파일시스템인지 확인합니다. 클라이언트 마운트 지점은 비어 있어야 기존 파일이 가려지지 않습니다.
sudo exportfs -v
sudo cat /etc/exportssystemctl status nfs-server.service --no-pagersudo ss -lntup | grep -E ':(111|2049) 'sudo namei -l /srv/nfs/team
df -hT /srv/nfs/teamfindmnt /mnt/team
sudo find /mnt/team -mindepth 1 -maxdepth 1 -print -quit클라이언트에서 실행합니다. 출력이 있으면 마운트 시 파일이 가려지므로 소유자 확인 전 진행하지 않습니다.- 기존 export가 있으면 소유 팀과 접속 중인 클라이언트를 확인했다.
- /srv/nfs/team 데이터의 백업과 복원 시험이 있다.
- /mnt/team은 기존 마운트가 없고 빈 디렉터리다.
- 상위 ACL과 UFW에서 2049를 <NFS_CLIENT_CIDR>로 제한할 수 있다.
활성 클라이언트가 있으면 export 변경은 중단을 일으킬 수 있습니다. 신규 경로·새 export로 검증한 뒤 계획된 유지보수 시간에 전환합니다.
서버와 클라이언트에 Ubuntu 지원 패키지를 설치합니다.
NFS 서버·클라이언트 패키지 설치
서버에는 nfs-kernel-server, 클라이언트에는 nfs-common을 설치합니다. 변경 목록을 먼저 확인하고 무인 승인 없이 설치합니다.
sudo apt-get updateapt-get --simulate install nfs-kernel-serversudo apt-get install nfs-kernel-serverapt-get --simulate install nfs-common각 클라이언트에서 실행합니다.sudo apt-get install nfs-common각 클라이언트에서 실행합니다.dpkg -l nfs-kernel-server nfs-common- 설치 미리 보기에 의도하지 않은 패키지 제거가 없다.
- 서버와 클라이언트에 필요한 패키지만 설치했다.
- 설치만으로 외부 export를 만들지 않았다.
패키지 설치 후 서비스가 자동 기동돼도 export가 없으면 공유되지는 않습니다. 포트를 넓게 열기 전에 경로와 export를 먼저 구성합니다.
공유 그룹·경로 권한과 CIDR 제한 export를 구성합니다.
공유 경로 권한과 root-squashed export 구성
공유 그룹의 숫자 GID를 고정하고 디렉터리에 setgid를 적용해 새 파일의 그룹을 유지합니다. export는 정확한 클라이언트 CIDR만 허용하고 root_squash와 동기 쓰기를 명시합니다.
date -u +%Y%m%dT%H%M%SZsudo cp --preserve=all --no-clobber /etc/exports /etc/exports.<BACKUP_SUFFIX>.bakgetent group <SHARED_GID>
getent group nfs-sharesudo groupadd --gid <SHARED_GID> nfs-share해당 GID와 그룹이 아직 없을 때만 실행합니다. 기존 그룹을 임의로 바꾸지 않습니다.sudo usermod -aG nfs-share <NFS_APP_USER>getent group <SHARED_GID>
getent group nfs-share승인된 각 NFS 클라이언트에서 실행합니다. 같은 숫자 GID가 다른 그룹에 사용 중이면 변경을 중단하고 ID 체계를 조정합니다.sudo groupadd --gid <SHARED_GID> nfs-share해당 GID와 그룹이 없는 클라이언트에서만 실행합니다. 중앙 ID 관리 환경이면 로컬 그룹 대신 기존 체계를 사용합니다.sudo usermod -aG nfs-share <NFS_APP_USER>새 그룹 멤버십은 신규 로그인 세션에서 확인하며 현재 관리 세션을 종료하지 않습니다.sudo install -d -o root -g nfs-share -m 2770 /srv/nfs/teamsudoedit /etc/exportssudo exportfs -rav구문 오류가 있으면 방화벽을 열지 말고 백업본과 비교해 수정합니다./srv/nfs/team <NFS_CLIENT_CIDR>(rw,sync,no_subtree_check,root_squash,secure)<NFS_CLIENT_CIDR>는 실제 소비 서버 대역으로 교체합니다. 여러 대역은 각각 별도 client(options) 항목으로 명시하고 와일드카드 전체 허용을 사용하지 않습니다.- 서버·클라이언트의 nfs-share GID가 동일하다.
- 공유 경로는 root:nfs-share와 2770 권한이다.
- export가 정확한 CIDR과 root_squash를 사용한다.
- async와 no_root_squash를 사용하지 않았다.
exportfs 오류가 있으면 서비스 재시작 전에 /etc/exports 문법을 고칩니다. root_squash는 클라이언트 root가 서버 root 권한으로 쓰는 위험을 줄입니다.
export와 서비스를 적용하고 서버에서 실제 상태를 확인합니다.
NFS 서비스 시작과 export 적용
현재 SSH 세션과 콘솔을 유지한 상태에서 export를 적용하고 서비스를 활성화합니다. export 목록이 계획한 경로·CIDR·옵션과 정확히 일치해야 합니다.
sudo exportfs -ravsudo systemctl enable --now nfs-server.servicesystemctl status nfs-server.service --no-pagersudo exportfs -vsudo journalctl -u nfs-server.service -n 100 --no-pager- nfs-server.service가 active와 enabled 상태다.
- exportfs -v에 계획한 한 경로와 CIDR만 보인다.
- root_squash와 sync가 유효하다.
예상하지 못한 export가 보이면 방화벽을 열지 말고 /etc/exports와 /etc/exports.d의 소유자를 확인합니다.
2049를 승인 CIDR에만 열고 임시 마운트·권한을 검증합니다.
임시 NFSv4 마운트 후 fstab 영구 반영
방화벽을 클라이언트 CIDR로 제한한 뒤 임시 마운트와 비-root 사용자 쓰기를 먼저 검증합니다. 성공 후에만 fstab을 백업·편집하고 systemd 구문 검사를 수행합니다.
sudo ufw allow from <NFS_CLIENT_CIDR> to <NFS_SERVER_PRIVATE_IP> port 2049 proto tcp현재 SSH 세션·콘솔과 같은 상위 ACL 제한을 유지합니다.sudo install -d -o root -g root -m 0755 /mnt/teamsudo mount -t nfs4 -o vers=4.2,nosuid,nodev <NFS_SERVER_PRIVATE_DNS>:/srv/nfs/team /mnt/teamfindmnt /mnt/team
nfsstat -msudo -u <NFS_APP_USER> touch /mnt/team/<CHANGE_ID>.write-test
stat /mnt/team/<CHANGE_ID>.write-test고유 변경 ID의 비민감 빈 파일을 사용하고 정상 검증 후 공유 운영 절차로 정리합니다.sudo fuser -vm /mnt/team
sudo umount /mnt/team열린 파일이나 작업이 없음을 확인한 뒤 해제합니다. 해제 실패를 강제 옵션으로 우회하지 않습니다.sudo cp --preserve=all --no-clobber /etc/fstab /etc/fstab.<BACKUP_SUFFIX>.baksudoedit /etc/fstabsudo findmnt --verify --verbose && sudo systemctl daemon-reload && sudo mount /mnt/team<NFS_SERVER_PRIVATE_DNS>:/srv/nfs/team /mnt/team nfs4 rw,vers=4.2,_netdev,nofail,x-systemd.automount,nosuid,nodev 0 0각 클라이언트에 반영합니다. 실행 파일이 필요한 공유라면 noexec 여부를 별도 위험 검토하되 nosuid·nodev는 유지합니다.- 승인 CIDR에서 NFSv4.2 임시 마운트가 성공한다.
- 비-root 업무 사용자가 쓰고 서버에서 기대한 GID로 보인다.
- 클라이언트 root가 서버 root 소유 파일을 임의로 만들 수 없다.
- findmnt --verify가 성공한 뒤에만 fstab을 반영했다.
- 비승인 네트워크에서는 2049에 접근할 수 없다.
permission denied는 전체 권한을 풀 문제가 아니라 UID/GID, 디렉터리 execute 권한, export 옵션을 순서대로 확인할 문제입니다.
신뢰 경계·백업·마운트 옵션과 장애 시 동작을 최종 점검합니다.
신뢰 경계·권한·복구 운영 점검
sec=sys NFS는 네트워크와 숫자 UID/GID를 신뢰합니다. 신뢰할 수 없는 구간이나 사용자 단위 강한 인증이 필요하면 Kerberos krb5p로 전환합니다.
sudo exportfs -vsudo namei -l /srv/nfs/team
sudo getfacl -p /srv/nfs/teamfindmnt -no SOURCE,TARGET,FSTYPE,OPTIONS /mnt/teamnfsstat --serversudo ufw status numbered- export는 정확한 사설 CIDR만 허용하고 root_squash를 유지한다.
- 공유 경로와 하위 파일에 world-write 권한이 없다.
- 클라이언트는 nosuid·nodev와 필요한 경우 noexec를 사용한다.
- 신뢰 경계 밖에서는 Kerberos krb5p 없이 NFS를 사용하지 않는다.
- 서버 데이터 백업·복원 시험과 클라이언트 장애 시 애플리케이션 동작 기준이 있다.
방화벽 CIDR만으로 사용자 신원을 증명할 수는 없습니다. 높은 보안 요구에서는 Kerberos, 전용 네트워크, 저장 데이터 암호화를 함께 설계합니다.
서버 export와 클라이언트 fstab을 양쪽에서 되돌릴 절차를 확인합니다.
클라이언트 마운트와 서버 export 롤백
클라이언트 사용을 중단하고 열린 파일을 확인한 뒤 마운트를 해제합니다. 각 클라이언트 fstab과 서버 exports의 선택한 백업을 복원하고 이번 방화벽 규칙만 제거합니다.
sudo fuser -vm /mnt/teamsudo umount /mnt/teamsudo test -f /etc/fstab.<BACKUP_SUFFIX>.baksudo cp --preserve=all --no-clobber /etc/fstab /etc/fstab.failed.<ROLLBACK_SUFFIX>sudo cp --preserve=all /etc/fstab.<BACKUP_SUFFIX>.bak /etc/fstab
sudo findmnt --verify --verbose && sudo systemctl daemon-reloadsudo test -f /etc/exports.<BACKUP_SUFFIX>.baksudo cp --preserve=all --no-clobber /etc/exports /etc/exports.failed.<ROLLBACK_SUFFIX>sudo cp --preserve=all /etc/exports.<BACKUP_SUFFIX>.bak /etc/exports
sudo exportfs -rav && sudo exportfs -vsudo ufw delete allow from <NFS_CLIENT_CIDR> to <NFS_SERVER_PRIVATE_IP> port 2049 proto tcp- 클라이언트 쓰기를 중단하고 열린 파일을 확인한 뒤 마운트를 해제했다.
- 클라이언트와 서버에서 같은 작업의 백업 접미사를 명시적으로 선택했다.
- 복원 전 현재 fstab과 exports도 별도 보존했다.
- exportfs와 findmnt 검증이 성공한 뒤 이번 방화벽 규칙만 제거했다.
- 공유 데이터 디렉터리는 삭제·이동하지 않았다.
umount가 busy이면 강제 해제보다 사용 프로세스와 영향 범위를 확인합니다. 복원 후 기존 클라이언트의 읽기·쓰기를 다시 검증합니다.
포트·권한·DNS·네트워크 장애 대응 가이드로 이어갑니다.
SECURITY CHECK
운영 전 마지막 보안 점검
- export를 정확한 사설 클라이언트 CIDR로 제한하고 root_squash를 유지한다.
- 서버·클라이언트 숫자 UID/GID를 일관되게 관리하고 world-write를 사용하지 않는다.
- 클라이언트 마운트에 nosuid·nodev와 업무에 맞는 noexec를 적용한다.
- 신뢰할 수 없는 네트워크에서는 Kerberos krb5p 없이 sec=sys NFS를 사용하지 않는다.
- 백업·복원 시험과 서버·네트워크 장애 시 클라이언트 애플리케이션 동작을 검증한다.
COMMON ERRORS
자주 막히는 지점
mount.nfs access denied by server
- 증상
- 클라이언트 마운트가 access denied by server while mounting 오류로 실패합니다.
- 가능한 원인
- export 경로, 클라이언트 CIDR, 적용되지 않은 exports 또는 DNS 경로가 다릅니다.
- 확인 순서
- 서버 exportfs -v와 실제 클라이언트 출발지 IP를 비교하고 exportfs -rav 오류를 확인합니다.
마운트는 되지만 쓰기 권한 없음
- 증상
- 목록 조회는 되지만 업무 사용자의 파일 생성이 Permission denied로 실패합니다.
- 가능한 원인
- 서버·클라이언트 UID/GID 불일치 또는 공유 경로의 그룹·execute 권한이 다릅니다.
- 확인 순서
- id, getent, namei, getfacl로 숫자 ID와 전체 경로 권한을 비교하고 과도한 권한으로 우회하지 않습니다.
부팅 후 NFS 마운트 지연
- 증상
- 클라이언트 부팅이 늦거나 네트워크 준비 전에 마운트가 실패합니다.
- 가능한 원인
- fstab에 _netdev·automount·nofail이 없거나 DNS·서버 가용성이 늦습니다.
- 확인 순서
- 콘솔에서 fstab을 복원하고 systemd mount/automount 상태와 DNS·2049 경로를 확인합니다.
PRIMARY REFERENCES
공식 문서
설치 저장소와 지원 버전은 바뀔 수 있습니다. 검토일 이후에는 링크된 공식 문서와 현재 서버의 패키지 후보 버전을 함께 확인하세요.