일일 정리

NFS, 그룹 함수와 HAVING

mysecurity 2025. 3. 5. 22:50

목차

1. NFS

1-1 NFS 개요

1-2 NFS 설치

1-3  /etc/exports 설정

1-4 NFS 실습

 

2. 그룹 함수와 HAVING

2-1 HAVING

2-2 HAVING 절을 이용한 검색

 

 

1. NFS

1-1 NFS 개요

- NFS 서버가 다른 서버에게 서비스를 하는 것으로, 네트워크를 통해 파티션을 공유하도록 제공하는 서비스이다.

- Sun 사에서 개발되어 대부분의 유닉스에서 사용한다.

- 모든 유닉스 서버는 플랫폼이 달라도 NFS를 통해 연결될 수 있다.

- 시스템의 리소스를 직접 제공하는 서비스이므로 보안에 주의한다.

 

● NFS 구성

NFS 구성도

 

- 서비스를 제공받는 서버들은 NFS 서버로부터 하드 드라이브를 공유받아 사용한다. 즉, 클라이언트들은 하드 드라이브가 없어도 된다.

- 한 유저가 서버를 통합으로 이용하고 싶다면 반드시 유저 계정 생성 시 UID 지정을 통해 UID를 같게 설정한다.

- 네트워크에 있는 하드 드라이브를 마운트하여 사용한다.

- NFS 서버 측에서 자신의 디렉토리를 마운트해 갈 수 있도록 허락만 해두고 클라이언트 측에서 마운트를 실행한다.

 

1-2 NFS 설치

● NFS 서버 설치 확인

# dnf list nfs‐utils

nfs 서버 설치를 확인하고 없다면 설치한다. 서버와 클라이언트 측 모두 필요하다.

 

관련 파일

- 데몬 : /usr/sbin/exportfs

- 관리 스크립트 : /usr/lib/systemd/system/nfs‐server.service

- 환경 설정 파일 : /etc/exports

 

systemctl   start    nfs-server.service 명령을 통해 실행한다.

                restart

                enable

 

1-3  /etc/exports 설정

NFS로 제공될 자원과 권한을 설정한다.

형식 :  [export 할 디렉토리] [허가할 클라이언트] [옵션]

 

- 주소/넷마스크의 표현 형식으로 사용 가능하다.

ex) 203.228.182.0/24 ‐‐> 203.228.182 네트워크의 모든 주소를 허가한다.

 

-  '*.msmc.or.kr' 과 같이 도메인 이름으로 설정할 수 있으나 쓸 일은 거의 없다.

 

ex) /etc/exports 파일 내부

 /             master(rw) trusty(rw,no_root_squash)
 /home/down    192.168.10.32(rw) 192.168.3.11(ro)
 /home/joe     pc001(rw,all_squash,anonuid=150,anongid=100)

 

- 허가할 클라이언트 부분에 master와 같이 이름으로 작성하려면 /etc/hosts 파일에서 ip와 이름을 매칭해놔야 가능하다.

- nfs에서 클라이언트의 디렉토리로 마운트했을때 클라이언트의 루트는 그 디렉토리로 들어가는 순간 그저 게스트로 인식된다.

 

● exports 옵션

- ro: 읽기 전용, rw: 읽기 쓰기 허용

- root_squash: 클라이언트의 root를 nobody로 매핑한다.

- no_root_squash: 클라이언트의 root와 서버의 root를 일치시킨다. (root 취급 해준다.)

- all_squash: 모든 사용자를 nobody로 매핑한다.

- no_all_squash: 서버의 사용자와 클라이언트의 사용자를 일치시킨다. 단, uid가 일치해야한다.

 

※ all squash 와 no_root_squash 동시 설정 시 클라이언트의 root 계정은 nobody로 인식된다.

  일반 유저 root
Default no_all_squash root_squash
설정 all_squash no_root_squash

 

- anonuid=uid, anongid=gid  : nobody로 매핑 될 경우의 계정과 그룹을 지정한다.

- sync : 파일 쓰기 후에 즉시 디스크를 동기화한다.

 

1-4 NFS 실습

● 클라이언트 측 mount 설정

mount  –t  nfs  NFS서버IP:/공유디렉토리  /마운트할디렉토리

ex) mount  192.168.11.17:/home/pub   /home/pub

 

- 일반 마운트 방식과 동일하며 재귀적인 마운트는 불허된다.

 

다음과 같이 /etc/exports 파일을 작성하고, 각 사용자의 디렉토리를 클라이언트에서 마운트하여 접근권한을 확인해볼 수 있다.

/home/a1 192.168.10.32(rw,no_root_squash)
/home/a2 192.168.10.32(rw,all_squash)
/home/a3 192.168.10.32(rw,no_all_squash)
/home/a4 192.168.10.32(rw,all_squash,root_squash)
/home/a5 192.168.10.32(rw,all_squash,no_root_squash)
/home/a6 192.168.10.32(rw,no_all_squash,root_squash)
/home/a7 192.168.10.32(rw,no_all_squash,no_root_squash)
/home/a8 192.168.10.32(rw,anonuid=##,anongid=##)

클라이언트 측에서 마운트 진행
클라이언트의 root 계정으로 파일 생성

 

- no_root_squash 설정한 디렉토리에서만 파일 생성이 가능한 것을 확인할 수 있다.

- all squash 와 no_root_squash가 동시 설정 된 A5 디렉토리에도 클라이언트의 root 계정으로 파일 생성이 되지 않는 것을 확인할 수 있다. NFS 서버에서 a5 디렉토리의 other의 w 권한을 허용해주면 파일 생성이 가능하다. 

 

nobody로 권한 설정된 파일 확인

 

all_squash 설정이 되어있다면 no_root_squash 설정이 되어있어도 클라이언트의 root 계정을 nobody로 인식하는 것을 확인할 수 있다.

 

st01 계정으로 파일 생성

 

서버 측과 클라언트 측 UID가 동일한 st01 계정으로 클라이언트에서 접근 시도 시, all_squash 설정이 되지 않은 A1 디렉토리에는 파일 생성이 가능하고, 유저와 그룹 권한이 st01 계정과 st 그룹으로 설정되어있음을 확인할 수 있다.

 

st01 계정으로 파일 생성

 

all_squash 설정이 된 A2 디렉토리에는 파일 생성이 불가한 것을 확인할 수 있다.

 

st03 계정으로 파일 생성

 

서버 측과 클라언트 측 UID가 다른 st03 계정으로 클라이언트에서 접근 시도 시, all_squash 설정이 되지 않은 A1 디렉토리에도 파일 생성이 불가한 것을 확인할 수 있다.

other에 대한 w 권한이 있는 A5 디렉토리에 파일을 생성하여 클라이언트 측 st03 계정을 nobody로 인식하는 것을 확인할 수 있다.

 

2. 그룹 함수와 HAVING

2-1 HAVING

SELECT ...
FROM  테이블...
WHERE 조건...
GROUP BY 컬럼
HAVING [그룹조건] ...
ORDER BY 정렬_대상... ;

 

- HAVING : 조건 중에 그룹 함수를 포함하는 조건을 기술한다.

                   그룹핑 된 조건을 기술한다.

- HAVING 절은 그룹된 결과에 대한 조건이므로 가능한 GROUP BY 절 뒤에 기술하는 것이 좋다.

- 단순히 WHERE 절에 그룹 함수가 쓰일 일이 있다면 HAVING 절로 옮긴다고 생각하면 맞다.

 

2-2 HAVING 절을 이용한 검색

ex) 부서별 급여 평균이 3천 달러 미만인 부서의 평균 급여를 검색한다.

SQL> SELECT dno 부서번호, TO_CHAR(AVG(sal),'$999,999') 평균급여
2  FROM emp
3  GROUP BY dno
4  HAVING AVG(sal) < 3000;

 

● HAVING의 조건

다음 HAVING 절은 잘못된 문장으로 본다.

SQL> SELECT SQL> SELECT dno 부서번호, COUNT(*) 인원수
2  FROM emp
3  GROUP BY dno
4  HAVING job != '개발';


SQL> SELECT dno 부서번호, COUNT(*) 인원수
2  FROM emp
3  GROUP BY dno
4  HAVING dno != '10';

 

- 첫 번째 문장은 GROUP BY 절에 기술되지 않은 일반 컬럼이 HAVING 절의 컬럼으로 들어갔으므로 에러가 발생한다.

 

- 두 번째 문장은 에러 없이 작동하긴 하나 그룹 함수가 없음에도 HAVING 절을 쓰는 것은 권하지 않아 사실상 잘못된 문장으로 본다. HAVING 절은 조건을 부여할 때 그룹 함수가 있을 경우에만 사용하도록 한다.

 

- 일반조건은 WHERE 절에 기술하며, 그룹된 컬럼(GROUP BY 절에 기술된)에 대한 조건은 HAVING 절에 기술할 수 있다.

 

다음과 같이 HAVING 절에 서브 쿼리를 사용하는 경우가 많이 발생한다.

ex) 부서 중 가장 급여를 많이 받는 부서를 검색한다.

SQL> SELECT d.dno, dname, AVG(sal)
2    FROM dept d, emp e
3    WHERE d.dno= e.dno
4    GROUP BY d.dno, dname
5    HAVING AVG(sal) = (SELECT MAX(AVG(sal))
6                       FROM emp
7                       GROUP BY dno);