ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CentOS 7] NFS 서버
    Linux/CentOS 2017. 12. 2. 18:20

    NFS은 1987년 선마이크로시스템즈에 의해 개발된 분산 파일 시스템 프로토콜로서 클라이언트 시스템의 사용자가 네트워크상의 원격지 서버에 있는 파일 및 디렉토리를 로컬 시스템에 있는 파일에 접근하는 것과 같은 서비스를 제공하는 클라이언트-서버 모델의 프로토콜 모델이다. 즉, 리죽스-리눅스 또는 유니스 간에 파일 공유 서비스를 제공하는 프로토콜이다. NFS 프로토콜은 원격지 서버 및 클라이언트 간의 통신을 위해 RPC(Remote Procedure Call,원격 프로시저[각주:1] 호출)를 사용하는데, NFS 서버 시작 시 반드시 이프로토콜 서비스가 활성화 돼 있어야 한다.



    1. NFS 프로토콜 이해



    1.1 NFS 시스템 구조

    1. NFS는 클라이언트-서버 모델로서 서버는 클라이언트에게 로컬 파일 시스템을 공유 디렉토리로 제공하고, 클라이언트는 서버가 제공하는 공유 디렉토리를 로컬 파일 시스템으로 마운트 해서 사용한다.

    2. 시스템의 프로그램이 시스템 콜을 통해 로컬 파일 시스템에 접근하려면 커널이 지원하는 VFS(Virtual File System) 인터페이스를 통해 접근할 수 있다.

    3. 시스템 콜(system call)은 컴퓨터 프로그램이 운영체제의 커널로부터 하드디스크 접속, 프로세스 생성이나 실행과 같은 서비스를 요청하는 방법으로서 프로세스와 운영체제 간에 필수적인 인터페이스를 제공하는 역할을 한다.

    4. VFS는 시스템에 존재하는 리눅스의 ex4, xfs와 같은 로컬 파일 시스템뿐 아니라 Samba에서 사용하는 SMB/CIFS 또는 CD-ROM 같은 다른 모든 파일 시스템으로의 접근을 허용하기 위해 사용하는 인터페이스다.

    5. 프로그램이 NFS 파일 시스템을 사용할 경우 먼저 VFS 인터페이스를 통해 NFS 클라이언트로 접근해서 이 요청을 NFS 서버에게 전달하는데, 이때 NFS 클라이언트의 요청은 먼저 RPC/XDR 프로토콜에 전달한다. 이 요청에는 NFS 서버의 이름과 공유된 디렉토리의 정보를 포함하고 있다.

    6. NFS 클라이언트는 애플리케이션 레이어(Layer 7)에서 동작하고, 이 RPC는 메시지의 교환에 관여하는 세션 레이어(Layer 5), XDR은 데이터 형식의 교환에 관여하는 프레젠테이션 레이어(Layer 6)에서 동작한다.

    7. RPC는 한 컴퓨터의 프로그램이 다른 컴퓨터에서 실행 중인 프로그램의 프로시저를 직접 호출해서 두 프로그램 사이에 직접 통신을 연결하는 프로토콜이다. 이때 RPC는 연결된 TCP/IP 네트워크를 통해 stub 모듈을 사용해서 클라이언트의 요청 파라미터를 서버에게 전달하고, 서버의 실행 결과를 다시 되돌려준다. NFS나 Ceph처럼 RPC는 분산 처리 기능을 제공하는 프로그램에서 주로 사용되며, 클라이언트에서 요청하는 프로그램이 서버 프로시저의 프로그램에서 주로 사용되며, 클라이언트에서 요청하는 프로그램이 서버 프로시저의 처리 결과가 반환될 때까지 일시적으로 정지 상태에 이르는 동기식(synchronous)방식을 사용한다. 현재 이러한 RPC는 NFS 서비스가 제공하는 rpcbind 데몬에 의해 제어되고 있다.

    8. XDR(eXternal Data Representation)은 선마이크로시스템즈에서 개발한 프로토콜로서 이기종 간에 컴퓨터의 데이터 표현 방식이 서로 다른 경우 한 컴퓨터에서 XDR 형식으로 데이터를 변환하고, 다른 컴퓨터에서 변환된 데이터를 해당 컴퓨터에서 사용하는 데이터 방식으로 변환한 뒤에 사용할 수 있게 도와주는 역할을 한다.

    9. RPC와 XDR은 이 요청을 TCP/IP 네트워크를 통해 NFS 서버에게 전달하는데, NFSv2와 NFSv3는 이 때 UDP와 TCP중에서 선택해서 사용할 수 있지만 NFSv4에서는 TCP 포트 2049번을 사용한다. 

    10. NFSv4의 경우 TCP 포트 2049번을 통해 요청을 받은 NFS 서버는 리눅스 파일 시스템에 접근하기 위해 VFS 인터페이스를 통해 파일 시스템에 접근하고, 다시 구체적으로 rpc.mountd 데몬을 통해 로컬 디스크를 NFS 클라이언트에게 전달함으로써 클라이언트 시스템이 서버의 로컬 디스크를 마치 자신의 로컬 파일 시스템처럼 사용할 수 있게 기능을 제공한다.



    1.2 NFS 버전 이해

    NFS는 현재까지 공개 버전으로 NFSv2, NFSv3, NFSv4, NFSv4.1 네 가지를 사용하고 있다. NFSv1은 선마이크로시스템즈 내부에서 사용됐기 때문에 공개되지 않았다. 


    a. NFSv2 (RPC 1989)

    - NFSv2는 1987년 선마이크로시스템즈 내부에서 사용하던 NFSv1을 RFC 규격에 따라 문서화하고 표준화해서 명명한 프로토콜

    - NFS 클라이언트가 접근 가능한 최대 크기는 32비트 제한으로 인해 2기가로 제한

    - 사용자가 서버의 파일 접근 시 파일의 권한 설정으로 이를 제한하고, 전송 프로토콜 UDP를 사용

    - NFS 데몬으로 portmapper, rpc.mountd, rpc.stard, rpc.lockd, nfsd등이 사용


    b. NFSv3 (RPC 1813)

    - NFSv3는 1995년 공개된 NFS 버전으로, NFSv2에 비해 더 큰 규모의 네트워크에서 사용 가능

    - 최대로 사용 가능한 파일 크기도 64비트를 지원함으로써 2기가 이상으로 확대

    - NFSv3는 NFSv2의 동기식 쓰기 기능 (Synchrounous Write:서버의 디스크에 데이터를 저장할때가지 클라이언트에 대한 응답을 기다리게 하며 설정 파일 옵션에서 sync로 표현)에 대한 성능 이슈를 해결하기 위해 시작

    - 비동기식 쓰기 (Asynchrounous Write:서버의 디스크에 데이터가 모두 저장되지 않아도 클라이언트 요청에 가능한 빨리 응답하며, 설정 파일 옵션에서 async로 표현) 기능을 지원

    - 전송 프로토콜 TCP를 사용

    - NFSv3는 Weak Cache Consistency 기능을 지원하기 시작했는데, 이 기능은 다른 클라이언트에 의해 수정된 파일에 대한 변경 사항을 클라이언트가 빨리 인식하게 도와준다.

    - 디렉토리에 대한 접근 제한은 파일의 권한과 더불어 IP 주소 및 도메인에 기반을 둔 ACL기능이 추가


    c. NFSv4 (RPC 3010)

    - 2000년에 공개된 NFSv4는 AFS(Andrew File System)와 SMB/CIFS의 영향을 받아 선마이크로시스템즈가 IETF로 그 개발을 이전한 이후 처음 개발된 버전

    - NFSv4는 성능 향상과 Kerberos 기반의 보안 기능, 강제적 잠금과 위임 기능을 구현하는 Stateful 프로토콜 기능

    - Compound 프로시저 기능 또한 구현했는데, 이는 클라이언트가 한 개의 요청에 여러 개의 RPC 호출을 포함해 서버에게 전달하는 기능으로 네트워크 요청 전달을 최소화

    - NFSv4는 그 이전 버전과 다르게 데몬들은 이 nfsd 로 모두 통합됐다. 또한 사용자와 그룹 ID를 이름으로 변환하기 위해 사용되는 rpc.idmpad 데몬과 RPCSEC_GSS 보안을 위해 rpc.gssd 데몬과 rpc.svcgssd 데몬이 새롭게 소개

    - NFSv4.1은 2010년 RFC 5661로 명명돼 현재 사용중인데, 이 버전은 분산 서버를 통해서 파일에 대한 병렬 접속을 허용하는 nNFS(Parallel NFS)기능을 제공




    2. NFS 서버 설정


    NFS 서버 설정에서 사용되는 중요한 파일 세가지는 다음과 같다.

    - /etc/exports : NFS 서버 설정 파일이며, NFS 서버에서 파일 공유를 위해 사용되는 모든 파일과 디렉토리를 정의하기 위해 사용

    - /etc/fstab : NFS 서버에서 설정한 공유 디렉토리를 NFS 클라이언트에서 사용하기 위해 사용되는 파일이며, 설정 후 부팅하면 자동으로 클라이언트 시스템에 마운트된다.

    - /etc/sysconfg/nfs : NFS 서버에서 제공하는 NFS 서비스를 위해 사용되는 모든 포트에 대한 정보를 설정하는 파일이다.


    2.1 NFS 패키지 설치와 공유 디렉토리 지정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # yum을 사용해 패키지를 설치한다.
    [root@master ~]# yum install nfs-utils libnfsidmap -y
    [root@master ~]# rpm -qa | grep nfs
    libnfsidmap-0.25-17.el7.x86_64
    nfs-utils-1.3.0-0.48.el7_4.x86_64
     
    # NFS 서버에서 클라이언트에게 공유를 허용할 디렉토리를 "server_share"라는 이름으로 생성
    [root@master ~]# mkdir /var/server_share
     
    # 클라이언트가 이 디렉토리를 접속해서 파일을 읽기 및 쓰기 권한을 사용하도록 권한 777로 설정한다.
    [root@master ~]# chmod -R 777 /var/server_share/
     
    # NFS 서버 설정 파일을 열어서 공유 디렉토리 및 옵션을 정의해 설정
    [root@master ~]# vi /etc/exports
    /var/server_share/      192.168.80.0/24 (rw,sync,no_root_squash,no_all_squash)
     
    # 위에서 설정한 공유 디렉토리 목록을 리프레시하라는 명령
    [root@master ~]# exportfs -r
     
    # libnfsidmap 패키지를 설치하면 사용 가능한 파일로서 NFSv4에서 NFS의 ID와 이름을 일치시키기 위해 사용되는데,
    # 클라이언트와 서버들이 함께 사용할 도메인 이름을 정의한다.
    [root@master ~]# cat /etc/idmapd.conf | grep Domain
    #Domain = local.domain.edu
    Domain = jaehwan.com
    cs

    공유 디렉토리 옵션 :

    - /var/server_share 클라이언트에게 공유할 허용할 디렉토리 이름

    - 192.168.80.0/24 공유된 디렉토리에 접근 가능한 클라이언트 IP 범위이며, *.google.com처럼 도메인 설정도 가능

    - rw 공유 디렉토리에 대한 읽기 및 쓰기 권한을 허용하는 옵션

    - sync 파일 시스템 변경 시 즉시 이 변경 사항을 동기화하라는 의미다.

    - no_root_squash 클라이언트에서 사용자 root로 공유 디렉토리에 접근 시 NFS 서버 시스템에서도 사용자 root로 인식하고 권한을 부여함을 의미한다. 보안을 고려한다면 root_squuash로 설을 권장하는데, 이 경우 클라이언트의 사용자 root는 서버에서 nfsnobody로 매핑돼 인식하게 된다.

    - no_all_squash 각 사용자의 권한을 공유 디렉토리에서도 허용함을 의미한다.



    2.2 NFS 서버 시작

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # 동적으로 서비스와 포트를 연결할 때 사용하는 RPC, 서비스를 관리하기 위한 rpcbind서비스, nfs-server 서비스를 활성화
    [root@master var]# systemctl enable rpcbind nfs-server
    Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
    [root@master var]# systemctl start rpcbind nfs-server
    [root@master var]# systemctl status nfs-server
    â nfs-server.service - NFS server and services
       Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
      Drop-In: /run/systemd/generator/nfs-server.service.d
               ââorder-with-mounts.conf
       Active: active (exited) since Wed 2017-10-25 16:52:21 UTC; 10s ago
      Process: 7425 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
      Process: 7420 ExecStartPre=/bin/sh -/bin/kill -HUP `cat /run/gssproxy.pid` (code=exited, status=0/SUCCESS)
      Process: 7419 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
     Main PID: 7425 (code=exited, status=0/SUCCESS)
    Oct 25 17:00:29 master.chul.com systemd[1]: Starting RPC bind service...
    Oct 25 17:00:29 master.chul.com systemd[1]: Started RPC bind service.
    â nfs-server.service - NFS server and services
       Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
      Drop-In: /run/systemd/generator/nfs-server.service.d
               ââorder-with-mounts.conf
       Active: active (exited) since Wed 2017-10-25 17:00:29 UTC; 4s ago
      Process: 7547 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
      Process: 7545 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
      Process: 7542 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
      Process: 7562 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
      Process: 7557 ExecStartPre=/bin/sh -/bin/kill -HUP `cat /run/gssproxy.pid` (code=exited, status=0/SUCCESS)
      Process: 7556 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
     Main PID: 7562 (code=exited, status=0/SUCCESS)
       CGroup: /system.slice/nfs-server.service
     
    # rpcbind 서비스가 사용하고 있는 포트 111번이 열려 있는지 확인
    [root@master var]# lsof -i tcp:111
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    systemd    1 root   24u  IPv6  13858      0t0  TCP *:sunrpc (LISTEN)
    systemd    1 root   25u  IPv4  13859      0t0  TCP *:sunrpc (LISTEN)
    rpcbind 7544  rpc    4u  IPv6  13858      0t0  TCP *:sunrpc (LISTEN)
    rpcbind 7544  rpc    5u  IPv4  13859      0t0  TCP *:sunrpc (LISTEN)
     
    # nfs-server 서비스를 시작하면 nfsd 데몬과 함께 ID와 이름을 매칭시켜주는 rpc.idmapd데몬과 
    # NFS 클라이언트의 접근을 허용하는 rpc.mountd 데몬도 같이 시작됐음을 알 수 있다.
    [root@master var]# ps -ef | grep rpc
    root       486     2  0 14:03 ?        00:00:00 [rpciod]
    rpcuser   7417     1  0 16:52 ?        00:00:00 /usr/sbin/rpc.statd
    rpc       7470     1  0 16:54 ?        00:00:00 /sbin/rpcbind -w
    root      7480     1  0 16:54 ?        00:00:00 /usr/sbin/rpc.idmapd
    root      7481     1  0 16:54 ?        00:00:00 /usr/sbin/rpc.mountd
     
    # 서버가 제공하고 있는 공유 디렉토리를 확인하기 위해 exportfs와 자세한 정보를 보여주는 v를 사용하면 확인 가능하다.
    [root@master var]# exportfs -v
    /var/server_share
                    192.168.80.0/24(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,no_root_squash,no_all_squash)
    cs



    2.3. 방화벽 설정

    한가지 주의할 점은, NFS는 RPC를 이용하기 때문에 동적으로 포트를 서비스와 연결한다고 설명했는데 이러한 동적  포트를 확인하기 위해 명령어 rpcinfo를 사용해 확인한 다음 서비스나 포트를 방화벽에 추가해줘야 한다는 점이다. 그런데 NFS 서비스를 위해 동적포트가 아닌 고정된 포트를 사용하려면 /etc/sysconfig/nfs 파일에 지정할 수 있는데, 이 경우 파일에 지정된 포트를 방화벽에 추가하면 된다. 상황에 따라 iptables 방화벽이나 firewalld 방화벽 중 한 가지만 선택해서 사용하기 바란다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    # 앞에서 설정한 포트 이외에 NFS 서버가 사용하는 동적 포트가 있는 경우 추가해줘야 한다.
    [root@master var]# rpcinfo -p
       program vers proto   port  service
        100000    4   tcp    111  portmapper
        100000    3   tcp    111  portmapper
        100000    2   tcp    111  portmapper
        100000    4   udp    111  portmapper
        100000    3   udp    111  portmapper
        100000    2   udp    111  portmapper
        100024    1   udp  51449  status
        100024    1   tcp  49281  status
        100005    1   udp  20048  mountd
        100005    1   tcp  20048  mountd
        100005    2   udp  20048  mountd
        100005    2   tcp  20048  mountd
        100005    3   udp  20048  mountd
        100005    3   tcp  20048  mountd
        100003    3   tcp   2049  nfs
        100003    4   tcp   2049  nfs
        100227    3   tcp   2049  nfs_acl
        100003    3   udp   2049  nfs
        100003    4   udp   2049  nfs
        100227    3   udp   2049  nfs_acl
        100021    1   udp  59304  nlockmgr
        100021    3   udp  59304  nlockmgr
        100021    4   udp  59304  nlockmgr
        100021    1   tcp  33934  nlockmgr
        100021    3   tcp  33934  nlockmgr
        100021    4   tcp  33934  nlockmgr
     
    # rpcbind가 사용하는 포트 111번을 프로토콜 UDP 및 TCP와 함께 클라이언트 네트워크 192.168.80.0/24에서 접속할 수 있도록 설정
    [root@master var]# iptables -A INPUT -s 192.168.80.0/24 -m state --state NEW -p udp --dport 111 -j ACCEPT
    # nfs 서비스가 사용하는 포트 2049번을 클라이언트 네트워크에서 접근 가능하게 설정한다.
    [root@master var]# iptables -A INPUT -s 192.168.80.0/24 -m state --state NEW -p udp --dport 2049 -j ACCEPT
    # NFS 서버의 디렉토리를 클라이언트가 마운트할 수 있게 지원하는 mountd 데몬이 사용하는 포트를 설정
    [root@master var]# iptables -A INPUT -s 192.168.80.0/24 -m state --state NEW -p udp --dport 20048 -j ACCEPT
     
    # [root@master var]# firewall-cmd --permanent --add-service=nfs
    [root@master var]# firewall-cmd --permanent --add-service=mountd
    [root@master var]# firewall-cmd --permanent --add-service=rpc-bind
    [root@master var]# firewall-cmd --permanent --add-port=46692/tcp
    [root@master var]# firewall-cmd --reload
    [root@master var]# firewall-cmd --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth0 eth1
      sources:
      services: dhcpv6-client http https mountd nfs rpc-bind ssh
      ports: 443/tcp 53/udp 80/tcp 53/tcp
      protocols:
      masquerade: no
      forward-ports:
      sourceports:
      icmp-blocks:
      rich rules:
    cs




    3. NFS 클라이언트 사용


    3.1 NFS 리눅스 클라이언트 (node1)

    NFS 서버의 공유 디렉토리를 클라이언트에서 사용할 때 크게 두 가지의 방법, 즉 수동의 마운트하는 방법과 자동으로 마운트하는 방법이 있다.


    a. 수동으로 마운트

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    # 서버에서와 마찬가지로 두 개의 NFS 패키지 명령어를 설치
    [root@node1 ~]# yum install nfs-utils libnfsidmap -y
    [root@node1 ~]# rpm -qa | grep nfs
    libnfsidmap-0.25-17.el7.x86_64
    nfs-utils-1.3.0-0.48.el7_4.x86_64
     
    # 서버처럼 동일한 도메인을 설정하기 위해 vim으로 수정
    [root@node1 ~]# vi /etc/idmapd.conf
    Domain = jeong.com
     
    # nfs-idmapd 서비스와 rpcbind 서비스를 시작
    [root@node1 ~]# systemctl start nfs-idmap rpcbind
     
    # NFS 서버에서 제공하고 있는 공유 디렉토리를 클라이언트에서 마운트하기 위해 디렉토리 생성
    [root@node1 ~]# mkdir /mnt/client_share
     
    # NFS 서버가 어떤 공유 디렉토리를 제공하고 있는지 알기 위해 옵션(e:export)를 사용하면 확인 가능하다
    [root@node1 ~]# showmount -e 192.168.80.5
    Export list for 192.168.80.5:
    /var/server_share 192.168.80.0/24
     
    # 파일시스템 타입(t:type)을 지정하고, 서버의 IP주소와 디렉토리 이름을 지정하고, 클라이언트 디렉토리를 마운트한다.
    [root@node1 ~]# mount -t nfs 192.168.80.5:/var/server_share/ /mnt/client_share
     
    # 마운트 정보를 확인해보면 NFSv4(vers=4.1)가 사용되고 있고, 여러 옵션과 함께 서버의 디렉토리가 클라이언트의 디렉토리로 마운트돼 있음을 확인가능
    [root@node1 ~]# mount | grep server
    192.168.80.5:/var/server_share on /mnt/client_share type nfs4 (rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.80.6,local_lock=none,addr=192.168.80.5)
     
    # 테스트를 위해 test 디렉토리를 생성하고 확인한다
    [root@node1 ~]# mkdir /mnt/client_share/test
    [root@node1 ~]# ls -l /mnt/client_share/
    drwxr-xr-x. 2 root root 6 Dec  2 07:29 test
     
    # 마운트된 디렉토리를 해제할 경우 umount를 사용하는데, 이 디렉토리가 어떤 사용자에 의해서든 사용되지 않는 경우여야 한다.
    [root@node1 ~]# umount /mnt/client_share/
     
    # NFS 서버인 master 노드에서 명령어 netstat를 통해 연결 확인해보면 master와 node1의 임의의 포트가 연결돼 있음을 확인 가능
    [root@master ~]# netstat -a | grep nfs
    tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN
    tcp        0      0 www.chul.com:nfs        www.node1.chul.com:869  ESTABLISHED
    tcp6       0      0 [::]:nfs                [::]:*                  LISTEN
    udp        0      0 0.0.0.0:nfs             0.0.0.0:*
    udp6       0      0 [::]:nfs                [::]:*
     
    cs


    b. 자동으로 마운트 (/etc/fstab)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 파일 시스템 정보가 저장된 파일 /etc/fstab를 열어서 
    [root@node1 ~]# vi /etc/fstab
    192.168.80.5:/var/server_share/ /mnt/client_share/      nfs     defaults        0 0
    # NFS 서버의 IP, 공유 디렉토리 이름, 로컬 디렉토리 이름, 파일 시스템 타입(nfs)과 기본 옵션을 지정
     
    # 업데이트 된 파일 시스템 정보가 적용되도록 시스템을 다시 부팅
    [root@node1 ~]# reboot
     
    # 시스템 부팅 이후에 mount로 확인해보면 서버의 디렉토리 자동으로 로컬의 디렉토리로 마운트돼 있음을 확인할 수 있다.
    [root@node1 ~]# mount | grep server
    192.168.80.5:/var/server_share on /mnt/client_share type nfs4 (rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.80.6,local_lock=none,addr=192.168.80.5)
    cs


    c. Automount 사용 (autofs)

    자동으로 NFS 서버의 공유 디렉토리를 마운트하는 두 번째 방법은 autofs를 이용한 자동 마운트다. autofs 패키지를 설치하고 이 서비스를 시작하면 automount데몬이 프로세스로서 동작하는데, 이 데몬이 NFS 클라이언트의 자동 마운트를 지원하는 역할을 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    # automount 데몬을 사용하기 위해 설치한다.
    [root@node1 ~]# yum install autofs -y
     
    # autofs가 사용하는 설정 파일을 열어 mount-poitn(/mnt), mount-name(auto.mount)을 지정한다.
    [root@node1 ~]# vi /etc/auto.master
    /mnt    /etc/auto.mount
     
    # 위에서 지정한 map-name 파일이 현재 없으므로 생성하고 아래 내용을 추가한다. :: create new : [mount point] [option] [location]
    # mount-point(nfsdir)을 지정하는데 /mnt/nfsdir을 의미하고 옵션으로 파일 시스템 타입(nfs)과 읽기/쓰기(rw), 마운트 할 서버위치 지정
    [root@node1 ~]# vi /etc/auto.mount
    nfsdir -fstype=nfs,rw   192.168.80.5:/var/server_share
     
    # autofs 서비스를 시작하고, 부팅 시에도 자동으로 서비스가 시작되도록 한다.
    [root@node1 ~]# systemctl start autofs
    [root@node1 ~]# systemctl enable autofs
    Created symlink from /etc/systemd/system/multi-user.target.wants/autofs.service to /usr/lib/systemd/system/autofs.service.
    [root@node1 ~]# systemctl status autofs
    â autofs.service - Automounts filesystems on demand
       Loaded: loaded (/usr/lib/systemd/system/autofs.service; enabled; vendor preset: disabled)
       Active: active (running) since Sat 2017-12-02 07:50:53 UTC; 7s ago
     Main PID: 10226 (automount)
       CGroup: /system.slice/autofs.service
               ââ10226 /usr/sbin/automount --pid-file /run/autofs.pid
    Dec 02 07:50:53 node1.chul.com automount[10226]: problem reading master map, maximum wait exceeded
    Dec 02 07:50:53 node1.chul.com automount[10226]: /usr/sbin/automount: warning: could not read at least one map source...g ...
    Dec 02 07:50:53 node1.chul.com automount[10226]: master_add_map_source: map source used without taking reference
    Dec 02 07:50:53 node1.chul.com systemd[1]: Started Automounts filesystems on demand.
    Hint: Some lines were ellipsized, use -l to show in full.
     
    # autofs 서비스를 사용할 준비가 됐으므로 새로 생성한 디렉토리로 이동하면, 데이터를 확인할 수 있다. 
    [root@node1 ~]# cd /mnt/nfsdir
    [root@node1 nfsdir]# ls
    test
     
    # autofs를 이용하면 명령어 사용 없이, 또는 재부팅 없이 자동으로 NFS 서버의 디렉토리를 마운트해 사용할  있다는 것을 확인
    [root@node1 nfsdir]# cat /proc/mounts | grep nfsdir
    192.168.80.5:/var/server_share /mnt/nfsdir nfs4 rw,relatime,vers=4.1,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.80.6,local_lock=none,addr=192.168.80.5 0 0
    cs

    - 주의 : 공유 디렉토리가 보이지 않는 경우 클라이언트에서 이 디렉토리에 대한 마운트 정보나 목록 정보가 보이지 않을 수 있다. 그러나 automount 프로세스가 동작하고 있다면 이 디렉토리로 이동하는 경우 자동으로 마운트를 해주기 때문에 자동 마운트가 동작하지 않고 있다고 오해하지 말자.




    4. NFS 서버 보안


    NFS 서버 보안은 크게 두 가지, 즉 호스트 기반의 보안과 사용자 기반의 보안으로 분류할 수 있다. NFSv2와 NFSv3에서 사용했떤 TCPWrapper는 호스트 기반의 보안 방법으로서 /etc/hosts.allow /etc/hosts.deny라는 두 파일을 사용해 접속을 허용할 호스트의 범위를 지정하는 방법을 사용했다. NFSv4에서는 소개된 RPCSEC_GSS는 Kerberos 기반의 보안 인증 방법으로서 TCPWrapper에서 불가능한 사용자 기반의 접속을 제어할 수 있다. NFS서버는 RPCSEC_GSS를 통해 클라이언트 시스템의 사용자들이 공유 디렉토리 접근 시 암호화를 사용해 사용자를 인증할 수 있으며, NFS 서버의 공유 디렉토리에 접근 가능한 호스트이더라도 Kerberos 인증 정보 없는 사용자의 접근을 금지할 수 있다.


    4.1 RPCSEC_GSS를 통한 NFS 보안

    NFS 서버에서 RPCSEC_GSS 인증이 이뤄지는 16단계의 과정을 통해 설명한다. 

    1. NFS 클라이언트 시스템의 사용자는 NFS 서버가 제공하는 있는 공유 디렉토리를 사용하기 위해 접근을 시도하하는데, 이 공유 디렉토리는 Kerberos에 의해 RPCSEC_GSS 인증이 적용된 상태다.

    2. NFS는 RPCSEC_GSS가 적용된 디렉토리에 접근할 인증 정보가 캐시 메모리에 없으므로 RPC 보안 context를 얻기 위해 이 요청을 rpc.gssd 클라이언트에 전달한다. 이때 클라이언트는 사용할 서비스 이름과 요청한 사용자의 ID 정보도 같이 전달한다. 

    3. rpc.gssd는 이 사용자의 유효한 인증 정보를 가지고 KDC에 접속해 이 사용자가 NFS 서버 접속에 필요한 인증 정보가 포함된 티켓을 요청한다.

    4. KDC는 rpc.gssd에게 요청한 사용자가 NFS 서버 접속에 필요한 티켓을 발행해준다.

    5. rpc.gssd는 이 티켓을 다시 클라이언트 NFS에게 전달한다.

    6. 클라이언트 NFS는 서버에게 NFS 서버 접속 요청과 함께 인증에 사용할 티켓을 제출한다. 

    7. NFS 서버는 이 요청의 허용과 거부를 결정하기 위해 이 티켓의 유효성 검사를 위해 rpc.gssd 서버에 전달한다.

    8. rpc.gssd 서버는 이 사용자 티켓의 유효셩 검증을 위해 이 티켓을 발행한 KDC에게 보낸다.

    9. KDC는 이 티켓을 받아 유효성을 검사한 뒤에 다른 티켓을 rpc.gssd 서버에게 발생하는데, 이 티켓은 요청하는 클라이언트에게 NFS 서버의 신분을 증명하기 위해 사용

    10. rpc.gssd 서버는 이 티켓을 다시 NFS 서버에게 되돌려준다.

    11. NFS 서버는 클라이언트에게 6천 요청을 대산 ACCEPT 응답과 함께 KDC가 발행한 티켓도 함께 보낸다.

    12. NFS 클라이언트는 이 티켓을 다시 rpc.gssd 클라이언트에게 돌려준다.

    13. rpc.gssd 클라이언트는 이 티켓의 유효성을 검증하기 위해 KDC를 호출한다.

    14. KDC가 이 티켓을 받으면 rps.gssd 클라이언트에게 티켓 유효성 검사의 결과를 알려준다.

    15. rpc.gssd 클라이언트는 이 결과를 다시 NFS 클라이언트에게 되돌려준다.

    16. 이제 6번과 11번 과정에서 인증이 필요 없는 본래위 NFS 과정이 이뤄지고 그 결과가 클라이언트의 사용자에게 마지막으로 전달된다.



    4.2 RPCSEC_GSS를 설정하는 방법

    Kerberos 서버를 먼저 공부하고 설정방법을 추가해야겠다...

    1. 어떤수행을 위한 일련의 작업 순서 [본문으로]

    'Linux > CentOS' 카테고리의 다른 글

    [CentOS 7] VSFTP 서버  (0) 2018.04.04
    [CentOS 7] 스토리지 서버의 다중화 (DRBD로 미러링 구성)  (0) 2018.03.06
    [CentOS 7] Nagios 서버  (0) 2017.10.31
    [CentOS 7] Apache 웹 서버 " 2 "  (2) 2017.10.26
    네트워크  (0) 2017.09.12

    댓글

작은거인's Blog / Designed by TISTORY