CentOS 7부터는 Single 모드로 들어가면 비밀번호를 요구한다. 
그래서 다음과 같은 방법을 사용해야 한다. 커널 옵션 값을 single이 아닌 init=/bin/bash(또는 init=/bin/sh)를 넣어야 한다.
옵션 값에 single을 넣게되면 root 비밀번호를 입력해야 쉘 환경으로 진입할 수 있다.

응급복구모드로 부팅하게 되면 인증 없이 root 권한을 가진 쉘 환경으로 부팅되며, 쉘 환경에서
root 비밀번호를 변경하면 비밀번호를 잊어버렸을 때에도 쉽게 변경할 수 있다.
단, 컴퓨터를 리부팅(<Ctrl>+<Alt>+<Del> 키를 입력하여 리부팅 할 것을 권장)해야한다는 문제는 있다.
위 “2. 커널 옵션 값 입력”과정에서 옵션으로 다음 그림과 같이 입력한다.

 rhgb quiet LANG=ko_KR.UTF-8을 삭제하고 init=/bin/bash를 입력한다.
rhgb 및 quiet를 삭제하지 않으면 키보드 입력에 문제가 생길 것이다.
입력 후에는 <Ctrl> + x 키를 입력하여 부팅한다.

부팅이 완료되면  root권한의 쉘 환경으로 부팅될 것이다. 기본적으로 부팅되면서 파일시스템은 읽기전용으로 마운트된다. 
이 부분을 읽기/쓰기 가능하게 mount -o remount,rw / 명령을 사용하여 다시 마운트 한다.

다음으로 passwd명령어를 입력한다. 새로운 비밀번호(New password:)입력부분에 변경하고자하는 root 비밀번호를 입력하고, 비밀번호 재입력(Retype new password:) 부분에 다시 한번 변경하고자하는 비밀번호를 입력한다. 변경이 정상적으로 완료되었으면 passwd: all authentication tokens updated successfully. 메시지를 출력할 것이다. 

변경 완료되었다면 부팅시 파일의 SELinux 컨텍스트 변경을 확정하기 위해 touch /.autorelabel을 입력한다. 다음으로 exit 또는 exec /sbin/reboot 명령어를 사용하여 시스템을 리부팅한다.


(참고) 비밀번호 변경하고 touch /.autorelabel을 입력하지 않은 경우 부팅은 정상적으로 되지만 root 비밀번호는 변경되지 않았을 것이다.
(참고) SElinux 를   disabled 로 설정하고 진행하여야 한다.



'배워서 남주자 > System 관리' 카테고리의 다른 글

[사용자 보안] PAM  (0) 2018.03.23
[서비스 관리] systemclt  (1) 2018.03.23
[시간/날짜 설정] timedatectl  (0) 2018.03.23
[로케일 설정] Locale 설정  (0) 2018.03.23
[사용자 관리] 시스템 사용자 관리  (0) 2018.03.23

[ 시간 /  날짜  설정 ]
1. 날짜와 시간을  모두 설정하기
   [root@vm-colt357 ~]# timedatectl  set-time "2017-01-13  14:15:35"

2. 날짜만 설정하기
   [root@vm-colt357 ~]# timedatectl  set-time "2017-01-13"

3. 시간만 설정하기
   [root@vm-colt357 ~]# timedatectl  set-time "14:15:35"

[ 시간대(Time zone) 변경 ]
1. 지원하는 시간대 확인하기
    시간대 정보가 너무 많아 파이프(|)와  grep 명령으로 Asia 또는  Seoul 지역만을 걸러낸다.
   [root@vm-colt357 ~]# timedatectl  list-timezones | grep Seoul
   Asia/Seoul

2. 리스트 중 변경하고자 하는 시간대를 다음과 같이 입력한다.
   [root@vm-colt357 ~]# timedatectl  set-timezone Asia/Segoul

[ RTC(하드웨어 시계) 시간 설정 ]
1. 하드웨어 시계의 시간을 설정하기 위해서는 다음과 같은 과정을 거쳐서 설정한다.
   [root@vm-colt357 ~]# timedatectl  set-local-rtc  yes
   [root@vm-colt357 ~]# timedatectl  set-time  "2017-01-13  14:15:35"
   [root@vm-colt357 ~]# timedatectl  
set-local-rtc  no
 -> 먼저, 시스템에서 하드웨어 시계를 사용하게 설정하고, 날짜와 시간을 설정 한 다음, 시스템에서 
      하드웨어 시계를 사용하지 않게 하는 것이다.  물론 시간을 맞우는 과정에서 ntpdate,  rdate  명령
      을 사요하여 동기화할 수 있다.
 -> RTC 타임 세팅은, 개인적으로 기존의 centos6 방식이 더 편하다.
     * 시스템 시간을 하드웨어 시간으로 설정.
           [root@vm-colt357 ~]#  hwclock -w
     * 하드웨어 시간을 시스템 시간으로 설정.
          [root@vm-colt357 ~]# hwclock -s



로케일(locale)은 사용자의 언어, 구가, 숫자 형식, 날짜/시간 형식, 시간대,  통화형식을 설정하고 있는 변수 모임이다. 이로케일은  RFC 3066에 정의되어 있다.
로케일의 설정에 따란  동일한 명령어의 결과가 다른 언어로 표시되기도 한다.

[root@vm-colt357 ~]# locale --help 
사용법: locale[옵션...] <이름> 
  혹은:  locale[옵션...] [-a|-m] 
로캘 관련 정보를 읽습니다. 

 시스템 정보: 
  -a, --all-locales          사용 가능한 로캘의 이름을  표시합니다 
  -m, --charmaps         사용 가능한 문자맵의 이름들을  출력합니다 

 출력 형식 수정: 
  -c, --category-name        사용 가능한 범주의 이름을 표시합니다 
  -k, --keyword-name         선택한 키워드의 이름을 표시합니다 
  -v, --verbose              더 많은 정보를 표시합니다 

  -?, --help                 이 도움말 리스트를 표시함 
      --usage                간략한 사용법 메시지를 표시함 
  -V, --version              프로그램 버전 표시

한국, 한국어, UTF-8 사용을 위한 기본 설정은 "ko_KR.UTF-8"이다.

     [root@vm-colt357 ~]# LANG=ko_KR.UTF-8   --> 기존  centos 6 에서의 설정 방법


centos 7  에서의 설정 방법.

     [root@vm-colt357 ~]# localectl    
     \   System Locale: LANG=ko_KR.UTF-8 
            VC Keymap: kr 
            X11 Layout: kr

    --> 로케일 및 키보드 관련 부분에도 새로운 명령어인 localectl 을 제공한다. 로케일 설정은 /etc/clcale.conf 에 저장
          되고,  centos 6 이하 버전에서 사용하던 /etc/sysconfig/i18n은 더 이상 찾아볼 수 없다.
  
 로케일 설정.
     [root@vm-colt357 ~]# localectl  set-locale  "LANG=ko_KR.UTF-8"



CentOS7에 와서 완전해진 NetworkManager 를 기본으로 제공한다.
nmtui 와 nmcli를 기반으로  TUI/CUI 환경에서 설정할 수 있다.

nmtui => 콘솔에서 사용 가능한  TUI   N/W 설정 프로그램
nmcli  => 콘솔에서 사용 가능한 명령어 기반 CUI  N/W 설정 프로그램

 ※  네트워크 디바이스 이름.
   eno1 → 펌웨어 또는  bios에서 온보드(on-board) 네트워크 디바이스에 대해 인덱스 번호를 제공한 이름.
   ens1 → 펌웨어 또는  bios 에서  PCI 인스프레스 핫 플러그 슬롯 인덱스 번호를 제공한 이름(핫 플러그 술롯 인덱스)
   enp2s0 → 하으뒈어 커넥터의 물리적 위치에 따람 명명한 이름.
   enxbx5ff41dfaa9 → 네트워크 인터페이스  MAC 주소에 따라 명명한 이름.
      ( *   en → 이더넷 , 
   wl   무선LAN ,    ww → 무선WAN )


NMTUI 를  이용한 네트워크 설정.
1.  nmtui  를  실행한다.
2.  Edit a connection  메뉴를 통해  네트웍 정보를 입력한다.
3.  Activate a connection 으로 변경된 값을 적용한다.
  ※ 원격 작업시 접속 끊김 상황을 피하려면  systemctl restart network   또는 nmcli 명령으로  변경값을 적용하기 바란다.

nmcli를 이용한 네그워트 인터페이스 작동시키기.
    [root@vm-colt357 ~]# nmcli  c  reload
  --> 전체 이더넷 인터페이스에 적용된다. 하나의 인터페이스만 적용하려면 경로를 함께 지정한다.
    [root@vm-colt357 ~]# nmcli  c  reload  /etc/sysconfig/network-scripts/ifcfg-ens33








여러 인터페이스를 묶어 하나의 본딩(bonding)된 채널(channel)로 만들 수 있다.
1G 네트웍크 인터페이스 4개를 묶어 4G의 대역폭을 확보할 수 있고, 묶여진 네트워크 인터페이스, 케이블, 스위치등의 장애에 대비할 수 있다.
네트웍크 본딩은 어더넷 본딩(Ethernet bonding), 포트 트렁킹(port trunking), 채널 티밍(channel teaming), NIC 티밍(teaming), 링크통합(link aggregation) 등의 용어로 다양한 네트워크 장비 및 운영체제에서 제공한다.
대부분 대역폭을 확장하기 위함 보다는 장애 대비용으로 많이 사용된다.

두개의 스위치 중 하나는  Active   다른 하나는 Standby 로 이중화 하였을 경우, CentOS에서는
본딩 설정을 하게되고 본딩의 여러 모드 중에서 active-backup(mode :1)을 사용하여 본딩을 구성한다.
만약 Active Switch와 연결된 NIC가  eth0 이고, Standby Switch와 연결된  NIC가 eth1 이라면  eth0을 primary로 지정해야 원활한 통신이 된다.

1. 본딩 모드(bonding mode)
본딩 모드는 본딩으로 묶여질 여러 slave 인터페이스들을 효율적으로 묶기 위한 여러가지 방법들이라고 보면 된다. 여러 상황에 따라 효율적인 방법을 선택하겠지만 일반적으로 Round-robin 모드와  Active backup 모드를 사용하며 네트워크 스위치가 802.3ad를 제공하고 스위치를 컨트롤 가능한 경우  802.3ad를 사용한다.

- mode 0 (balance-rr) - Round-robin --> 기본값 
- mode 1 (active-backup) - Active backup --> 빈번히 사용된
- mode 2 (balace-xor) - XOR --> 해시방석
- mode 3 (broadcast) - Broadcast 
- mode 4 (802.3ad) - 802.3ad  --> 스위치 802.3ad 요구
- mode 5 (balancd-tlb) - Adaptive transmit load balancing
- mode 6 (balancd-alb) - Adaptive load balancing

Round-robin (0  또는 balance-rr)
Round-robin 정책은 장애 대비와 트래픽 분산을 위해 설정한다. 데이터 송/수신은 살아있는 Slave 인터페이스를 통해 분산되어 순차적으로 발송된다. 이모드는 이중화된 스위치 구성에서는 잘 작동되지 않기 때문에 단일 스위치의 여러 포트에  Slave 인터페이스들을 연결해야 한다.

Active-backup (1  또는 active-backup)
Active-backup 정책은 가장 많이 사용되며 장애 대비를 위해 설정한다. 여러개의  Slave  인테페이스로 구성할 수 있지만, 구성된 여러개의 Slave 인터페이스 중 오직 하나의  Slave 인터페이스만  전송에 사용된다. 즉 4개의 Slave 인터페이스를 사용하더라도 오직 1개의 Slave 인터페이스만 사용된다는 것이다.
Slave 를 많이 둔다고 성능이 향상되는 것은 아니다. 이 모드는 스위치의 어떠한 설정을 하지 않아도 된다.  이 모드는 추가 설정으로 주가 되는 디바이스를 설정할 수 있다. Active 스위치와  Standby 스위치로 구성했을 때 유용하다. 이 모드는 infiniBand를 본딩할 수 있는 유일한 모드이다.

기타 모드 생략...



2. 본딩 설정(TUI  환경)

이미 설정된 네트워크 디바이스 설정 삭제
먼저 본딩에서 슬레이브(slaver)로 사용하여 묶을 네트워크 디바이스가 다른 용도로 사용되거나 통신을 휘해 설정되었다면 본딩 굿어 후에 문제가 될 수 있다. 다음과 같이 nmcli 명령으로 확인하고 연결된 것이 있는지 확인한다.

[root@vm-colt357 ~]# nmcli  connection
이름   UUID                                  유형            장치 
eth1  0ef567f5-53e6-4fd2-b417-18be0f2d2ed3  802-3-ethernet  eth1
eth0  0ef567f5-53e6-4fd2-b417-18be0f2d2ed3  802-3-ethernet  eth0

만약 위와 같이 eth0, eth1에 해나 설정이 있다면, 다음과 같이 삭제한다.
[root@vm-colt357 ~]# nmcli  connection  delete eth0
[root@vm-colt357 ~]# nmcli  connection  delete eth1

콘솔화면에  nmtui를 인력한다  -->  Edit a connection을 선택한다  -->  우측에 <Add>를 선택한다  -
-> 
화면에서 Bond를 선택한다  -->  Profile name(연결이름)을 bone0로 한다. 고전적으로 본딩을 하게되면  bond0를 기본으로 하였다. 만약 2개의 본딩을 구성한다면 두 번째 이름은 bond1이 된다.(이름은 자유롭게 할수 있다.) Device 이름은 GUI에서는 자동으로 정해지지만, nmtui는 임력해 주어야 한다. 동일하게 입력한다.  -->  다음으로 <Add>를  선택하여 본딩에 사용될 네트워크 인터페이스(Slave)를 추가한다.  -->  연결 종류를 선택한다. 이더넷 또는 인피니밴드를 선택할 수 있다.  이더넷을 선택한다. 이더넷 추가 화면이 나타나며, Profile name(연결이름)을  eth0 (디바이스 이름)으로 한다.  물론 이 또한 다른 이름으로 할 수 있으나 설정 후에는 /etc/sysconfig/network-scripts/ifcfg-이름  형태로 저장되기 때문에 혼란스러울 수 있다. 장치명과 동일한 이름으로 연결 이름을 입력한다. 다음으로  Device에 eth0을 입력한다. --> OK를 선택한다. -->  동일한 방법으로 eth1에 대해 이더넷 설정을 한다. --> 설정이 완료되면 Slaves에 2개의 장치가 추가 되어 있을 것이다.  -->  다음으로 Mode를 선택한다. 기본은 라운드 Round-robin인데 앞에서 소개한 여러 모두 중에 Active backup으로 설정한다. 액티브 백업으로 선택하면  Primary 인터페이스를 입력하는 항목이 나타나는데 여기서 기본을고 지정할 즉  Active 스위치에 연결될 디바이스 이름( eth0)을 입력한다. 연결 감시는 MII 로 두고   Monotioring frequency(감시주기) 는 네트웍크 상황에 ㄸ라 다르지만 100 또는 200 으로 설정한다. 나머지는 기본으로 둔다.
-->  다음으로 
IPv4 CONFIGURATION 부분에 Manual 로 변경하여 IP정보를 입력해 준다.
-->  
NetworkManager를 재실행 한다.


1. ip
    커널 2.4이후 리눅스 고급 네트워킹 기능을 사용하기 위한 유틸리티로 ip를 많이 사용한다. 
    ip는 iproute 패키지로 기본 제공된다.
    많은 기능들이 ip 유틸리티로 통합되었다.

[네트워크 연결 확인 : ip link]
[root@vm-colt357 /]# ip link 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 
    link/ether 00:0c:29:a3:5b:8c brd ff:ff:ff:ff:ff:ff


위와 같이 ip link 라고 입력하면 네트워크 연결상태를 알려준다. 여기서 중요한 것은 state UP이다. 네트워크에 연결되지 않았다면 state DOWN으로 나타난다.  여러 링크관련 고급 설정을 할 수 있는데 이 방법은 멘페이지(man ip-link)에서 확인할 수 있다.

[네트워크 연결 확인 : ip addr]
[root@vm-colt357 /]# ip -4 addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 
    inet 127.0.0.1/8 scope host lo 
       valid_lft forever preferred_lft forever 
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 
    inet 192.168.0.20/24 brd 192.168.0.255 scope global ens33 
       valid_lft forever preferred_lft forever


위 결과는 네트워크 인터페이스에 할당된 IP 주소와 서브넷마스크, 브로드케스트 IP, 연결상태를 한눈으로 볼수 있는 결과이다. “-4”옵션을 사용한 것은 IPv4에 해당되는 내용만 보기 위함이다. ifconfig 명령어로 확인 가능한 정보이지만 좀더 깔끔하게 보여준다. ip 고급설정을 위해 사용할 수 있는데 그 방법은 멘페이지(man ip-address)를 확인하길 바란다. 


2. ifconfig
    ifconfig는 현재 시스템에 장착되어 있는 네트워크 인터페이스를 설정하거나 확인하는 명령어이다. 서버가 통신을 하기 위해서는 네트워크 인터페이스(NIC, 흔히 랜카드)가 있어야 하는데, 이러한 네트워크 인터페이스의 네트워크 정보를 설정, 변경 및 확인하는 명령어가 ifconfig이다.

ifconfig로 확인 가능한 네트워크 인터페이스의 내용은 다음과 같다.

∙MAC 주소
∙eth0에 할당된 IP 주소
∙브로드케스트(BroadCast)
∙서브넷마스크(Subnet Mask)
∙MTU(Maximum Transfer Unit)
∙RX packets(부팅 후 현재까지 받은 패킷수)
∙TX packets(부팅 후 현재까지 보내진 패킷수)
∙Collisions
∙Interrupt 주소
∙현재 UP(사용가능) 되어 있는지 여부

3. netstat : 인터페이스 통계 및 기타 정보 확인
netstat는 현재 연결된 네트워크 연결과 라우팅 테이블, 인터페이스에 대한 통계, 마스커레이딩 연결, 멀티캐스팅 정보 등을 보여준다. 즉, netstat 명령으로 어떤 호스트(또는 서버)들과 어떤 서비스로 연결되어 있는지와 그 연결 상태는 어떠한가에 대한 정보들을 알 수 있다.

① 어떤 클라이언트와 연결되었는가?
② 어떤 서비스(www, ftp, mysql, ssh 등)로 연결되었는가?
③ 어떤 포트(port) 번호로 연결되어 있는가?(②의 서비스에 대한 포트 번호)
④ 연결상태(wait, listen, connect 등)는 어떠한가?
⑤ 네트워크 연결상태가 어떻게 되어 있는가?
⑥ 기본 게이트웨이의 설정이 제대로 되어 있는가?
⑦ route에서처럼 라우팅 경로는 어떠한가?

4. route : 라우팅 테이블 확인 및 설정
route는 라우팅 경로(다른 말로 “라우팅 테이블”)를 보거나 변경할 수 있도록 해주는 명령어이다. 주로 이더넷(Ethernet) 카드를 설정할 때 패킷들이 어떠한 경로로 외부로 나가야 하는지 알려주는 역할을 한다. 인터넷은 네트워크들이 게이트웨이를 통해 이리저리 연결되어 있는 커다랗고 복잡한 네트워크이다. 이러한 네트워크에서 지표가 되는 것은 오직 도메인 네임과 IP 주소 밖에는 없다. 따라서 호스트에 설정된 라우팅 테이블은 패킷들이 자유로이 이동할 수 있도록 한다. 

5. traceroute : 라우팅 경로 확인
어느 날 서버에 접속한 상태에서 다른 서버로 ssh 접속이 안 되는 것을 발견했다고 가정해 보자. 즉시 옆에 있는 166.104.50.152로 ping을 보내 보았으나 이것은 아무 문제가 없었다. 내부 네트워크가 잘 작동 중인데 외부로 연결이 안 된다면 외부로 연결된 어느 게이트웨이 중 하나가 잘못 됐을 가능성이 있다. 이를 확인해 보는 방법은 traceroute를 이용하는 것이다.
인터넷은 네트워크 하드웨어들이 게이트웨이를 통해서 서로 연결된 거대하고 복잡한 집합체이다. traceroute는 사용자가 원하는 호스트까지 패킷이 어떠한 경로로 전달이 되는지를 작은 ttl(time-to-live) 값과 돌아오는 'ICMP TIME_EXCEEDED' 응답을 통해 사용자에게 알려준다. 

6. tracepath : 경로 확인
tracepath는 패스를 가지고 있는 MTU를 통해서 목적 시스템까지의 경로를 알아내는 프로그램이다. 이 프로그램은 UDP 포트나 불규칙적으로(random) 몇몇의 다른 포트를 사용한다. 

7. ping : 원격 호스트 응답 테스트
컴퓨터의 네트워크가 정상적으로 동작중인지 확인해 볼 때 사용하는 도구이다. ping은 특정 호스트로 ICMP(Internet Control Message Protocol) 에코 메시지를 사용해서 원격 호스트가 다시 로컬 호스트로 응답하도록 한다.

8. arp : ARP 테이블 관리
arp는 “Address Resolution Protocol”의 약자로서 동일한 네트워크 내에 존재하는 호스트들의 IP 주소와 ethernet 주소(MAC 주소)를 확인하는 명령어이다. 즉, 특정 네트워크 내에 어떤 호스트들이 존재하는지를 확인할 수 있는 것이 바로 arp 명령어이다. arp는 이를 위해 리눅스의 /proc/net/arp에 기록된 ARP 관련 정보를 참조한다.

9. nslookup : 도메인 네임 서버 질의
nslookup은 인터넷 도메인 네임 서버에 사용자가 직접 도메인 이름을 질의할 수 있도록 해주는 프로그램이다. 이 프로그램을 통해 누구나 네임서버에 직접 질의하여 도메인 네임 서버가 가지고 있는 정보를 검색할 수 있는 것이다. 이를 통해 사용자는 도메인 네임 서버가 올바르게 설정되고 동작하고 있는지를 확인할 수 있다.

10. dig : 도메인 네임 서버 질의
dig(Domain Information Groper)는 지정한 DNS 서버의 설정 내용과 특정 도메인의 네임서버 설정 내용을 확인하는 명령이다. 즉, nslookup 명령과 거의 같은 역할을 한다. nslookup 명령과 host 명령과 마찬가지로 /etc/resolv.conf 파일에 정의되어 있는 네임서버를 기본 네임서버로 사용한다. 

11. host : 도메인 네임 서버 질
host는 도메인 네임 서버에서 도메인의 설정 정보를 찾기 위한 간단한 유틸리티이다. 이것은 보통 도메인 이름들을 IP 주소로 바꿔서 정보를 알려 주기 위해 사용된다. host 명령은 nslookup과 dig와 마찬가지로 /etc/resolv.conf 에 설정된 도메인 네임 서버를 기본 네임서버로 인식한다. 



Passwd 파일에서 사용자 계정만 확인하기
~] # cat /etc/passwd | awk -F: '{if($3>=1000 && $3<=60000)print $0}'
doly:x:1000:1000:doly:/home/doly:/bin/bash
colt357:x:1001:1001:홍길동:/home/colt357:/bin/bash

cat 명령어를 사용하여 /etc/passwd 파일을 표준 출력(stdout)으로 출력하고 파이프(|)를 통해 awk(라인 단위 패턴 스캐닝 및 처리 언어) 명령의 표준 입력(stdin)으로 보낸다. -F 옵션을 사용하여 구분자를 “:”으로 지정한다. “:”으로 구분했을 때 3번째 항목($3)이 1000보다 크고 60000보다 적을 경우 라인의 모든내용($0)을 출력하라는 것이다. 
CentOS7 부터는 기본적으로 UID를 1000에서 60000까지 사용하도록 /etc/login.defs에 설정되어 있다



사용자 추가시 홈 디렉토리에 생성되는 파일
사용자 추가시 생성되는 홈디렉토리에는 다음과 같은 파일들이 생성되어 있을 것이다. 다음은 wyjung
 사용자의 홈디렉토리를 확인해 본 것이다.


~] # ls -Al /home/colt357/
합계 12
-rw-r--r--. 1 colt357 colt357  18  6월 10 13:31 .bash_logout
-rw-r--r--. 1 colt357 colt357 193  6월 10 13:31 .bash_profile
-rw-r--r--. 1 colt357 colt357 231  6월 10 13:31 .bashrc
...
ls 명령어에 -Al옵션을 사용하여 colt357 사용자의 홈디렉토리(/home/colt357/)의 파일 및 디렉토리를 확인하였다. 다음 파일들이 있다.
.bash_logout : 로그아웃 할 때 실행되는 파일이다.
.bash_profile : 로그인시 실행되는 파일이다. 
.bashrc : .bash_profile에 의해 실행되며 주로 alias나 함수등을 설정한다.

위 3개의 파일은 사용자를 추가할 때마다 생성된다. 시스템에 따라 위 3개의 파일보다 더 많은 파일, 디렉토리가 생성될 수 도 있다. 이는 사용자 생성시 기본적으로 복사되는 파일 및 디렉토리이며, /etc/skel/ 디렉토리에 파일 및 디렉토리가 사용된다. 

~] # ls -Al /etc/skel/
합계 12
-rw-r--r--. 1 root root  18  6월 10 13:31 .bash_logout
-rw-r--r--. 1 root root 193  6월 10 13:31 .bash_profile
-rw-r--r--. 1 root root 231  6월 10 13:31 .bashrc
...

위 3개 또는 그 이상의 파일 및 디렉토리를 열어보면 사용자 홈디렉토리에 존재하는 파일과 내용일 동일한 것을 확인할 수 있다.
위 3개의 파일을 수정하면 사용자 생성시 수정된 파일을 복사해 사용하게 될것이다.


계정 정보 확인
~] # chage -l colt357
마지막으로 암호를 바꾼 날                                       : 7월 16, 2014
암호 만료                                       :안함
암호가 비활성화 기간                                    :안함
계정 만료                                               :안함
...
chage 명령어에 -l 옵션을 사용하여 계정 만료일 등을 알 수 있다.

- 계정이 기간 만기되도록 함(E)
~] # usermod 
colt357 -e 2014-09-10
위와 같이 설정하면 wyjung 계정은 2014년 9월 10일에 만료되도록 하는 것이다.
- 계정을 잠금 / 해제
~] # passwd -l 
colt357
colt357 사용자의 비밀 번호 잠금
passwd: 성공
~] # passwd -u 
colt357
colt357 사용자의 비밀 번호 잠금 해제 중
passwd: 성공

위와 같이 passwd 명령어를 사용하여 -l 옵션으로 colt357 사용자를 로그인 못하도록 잠금거나 -u 옵션을 사용하여 해제 할 수 있다.


[비밀번호 보안 정책]
많은 보안 권고사항을 보면 비밀번호는 적어도 3개월에 한번찍 변경하게 하고 있다. 여러 보안 점검에서 사용자 비밀번호를 3개월 마다 변경하게 강제하고 있고 모든 사용자에게 설정해야 한다. 앞에서 설명한 것은 사용자들 마다 비밀번호 강제 변경주기를 설정하였지만 다음과 같이 설정하여 기본적으로 적용할 수 있다.

/etc/login.defs 파일을 열어 다음과 같이 수정한다.

PASS_MAX_DAYS   90
PASS_MIN_DAYS   0
PASS_MIN_LEN    8
PASS_WARN_AGE   7

위 설정에 대한 의미는 다음과 같다.
PASS_MAX_DAYS : 암호를 변경하지 않고 사용할 수 있는 유효기간   기본 값은 99999일이며, 권장은 3개월(약 90일)이다. 
PASS_MIN_DAYS   : 암호를 변경할 수 있는 최소 기간이며   암호는 자주 변경해도 무관하니 제한이 없는 기본값 0으로 둔다.
PASS_MIN_LEN   : 암호 최소 길이이다.   암호 최소 길이는 기본 5자 이상이며, 권장은 8자 이상이다.
PASS_WARN_AGE   : 암호 유효기간이 끝나기 전에 경고 메시지를 보여줄  날수를 설정한다. 기본 7일이며 기본값을 유지한다.

그 밖에 /etc/login.defs 에는 메일관련(메일큐 디렉토리, 메일박스 디렉토리, 메일파일)설정과 사용자 UID범위, 시스템 사용자 UID범위, 그룹 GID범위, 시스템 그룹 GID범위, 사용자 삭제시 실행할 사용자 프로그램 지정, 사용자 생성시 사용자 홈디렉토리 생성 유무 및 UMASK등을 설정할 수 있다. 사용자 삭제시 사용자 그룹의 멤버가 없다면 그룹까지 삭제할지 유무도 여기서 설정한다. /etc/login.defs 파일을 열어보면 위 기능에 대해 상세히 설명되어 있다.

그룹(G) 탭을 확인해 보자.
시스템에 등록된 전체 그룹리스트가 나타나고 원하는 그룹을 선택하여 소속시킬 수 있다. 기본 그룹을 변경할 수 도 있다. 
위 설정을 명령어를 이용한다면 다음과 같이할 수 있다.

사용자가 속한 그룹 확인
다음 명령어로 특정 사용자가 속한 그룹을 확인할 수 있다.

~] # groups colt357
colt357 colt357 superuser

groups 명령어로 사용자가 속한 그룹을 확인하였다.

사용자가 속한 그룹 추가
다음 명령어로 사용자가 속한 그룹을 추가할 수 있다.

~] # usermod -a -G  master  colt357
~] # groups colt357
colt357 colt357 master  superuser

usermod의 -G 옵션을 사용하여 소속 그룹을 설정하였다. 만약 -G 옵션만 준다면 소속된 그룹이 “master"로 변경될 것이다. -a (추가) 옵션을 주어 기존 그룹은 유지하면서 "master"그룹에 추가하도록 한 것이다.


사용자가 속한 그룹 제거
사용자가 속한 그룹에서 특정 그룹만 제거하는 것은 아무리 찾아보아도 옵션을 제공하지 않았다. 다음과 같은 방법으로 제거할 수 있다.


~] # groups colt357
colt357 colt357 master superuser wheel
~] # usermod -G superuser,wheel colt357
~] # groups colt357
colt357 : colt357 superuser wheel

위 예는 groups 명령어를 이용하여 소속된 그룹을 확인하였고 usermod의 -G옵션을 이용하여 사용자의 소속그룹을 재설정한다. groups명령으로 확인한 소속그룹중 제거하고자 하는 그룹만을 빼고 “,”로 구분하여 모두 입력한다. 이러한 방법으로 소속 그룹을 제거할 수 밖에 없다. 

사용자의 기본(primary) 그룹 변경
사용자의 기본그룹은 다음과 같이 변경할 수 있다.

~] # groups colt357
colt357 : colt357 superuser
 ~] # usermod -g master colt357
 ~] # groups colt357
colt357 : master superuser

groups명령어 입력시 처음에 보여주는 것이 기본 그룹이다. 기본그룹을 바꾸기 위해 usermod의 -g 옵션을 사용하여 "master"로 변경하였다. 변경된 기본그룹을 groups 명령어로 확인하고 있다.



 [관리자 권한 전환]

앞에서 리눅스의 사용자 및 그룹을 관리하는 방법을 다루었다. 멀티유저 운영체제는 최고관리자라는 특별한 사용자가 있다. 윈도우즈의 경우는 Administrator이고 리눅스와 유닉스에서는 root를 최고관리자로 사용하고 있다. 
최근에는 보안상의 이유로 root 사용자로의 직접 로그인을 권장하지 않고 일반 사용자로 로그인한 다음 필요시 root권한으로 작업하게 하고 있다. CentOS7의 기본은 다음과 같다.

로컬 로그인 : root 로그인 가능 / 불가는 권장
telnet 로그인 : root 로그인 불가능 / 불가능 권장, telnet 사용 권장하지 않음
ssh 로그인 : root 로그인 가능 / 불가능 권장
ftp 로그인 : root 로그인 불가능 / 불가능 권장

CentOS7의 경우는 로컬 로그인시 root 사용이 가능하지만 최근에 등장하는 리눅스의 경우 기본적으로 로컬 root 로그인을 차단하는 경우가 많다.
보안 설정에서 다루겠지만, ssh의 경우 root 직접 접근을 차단하고 특정 그룹에 소속된 사용자만 ssh 접근이 가능하게 한다.
CentOS7은 설치과정에서 root이외의 관리자계정을 등록한다. 등록된 관리자 계정은 sudo 명령어를 통해 root 권한으로 작업이 가능하다. 이는 sudo 설정파일인 /etc/sudoers 파일에 wheel 그룹은 root 권한으로 모든 작업이 가능하게 설정되어 있고 관리자계정으로 등록된 사용자는 wheel 그룹에 등록되어 있었다. 이는 사용자 추가후 wheel 그룹에 등록을 한다면 sudo 명령어를 통해 root 권한으로 작업을 할 수 있다는 것이다.
앞에서 다루었던 여러 가지 방법으로 사용자를 wheel 그룹에 추가해 보자.

~] # groupmems -g wheel -l
doly
~] # usermod -G wheel wyjung
~] # groupmems -g wheel -l
doly wyjung

groupmems 명령어로 wheel 그룹의 사용자를 확인하고, usermod 명령어로 wyjung사용자를 wheel 그룹에 맴버로 추가하였다. 그리고 다시 groupmems 명령어로 wheel 그룹에 wyjung 사용자가 추가된 것을 확인하였다.


[root 권한으로 명령어 실행]

~] $id
uid=1001(wyjung) gid=1001(wyjung) groups=1001(wyjung),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
~] $ yum install system-config-users
Loaded plugins: fastestmirror, langpacks
You need to be root to perform this command.
~] $ sudo yum install system-config-users
[sudo] password for wyjung: 사용자암호
Loaded plugins: fastestmirror, langpacks
...

위 내용은 id 명령어로 사용자 아이디 및 UID, GUI, 소속된 그룹을 확인하였다. 현재 계정이 wyjung이고 wyjung는 wheel 그룹에 등록되어 있는 것을 확인할 수 있다. yum 명령어로 system-config-users 패키지를 설치하려 했으나 root가 아니면 실행할 수 없다는 메시지를 만나게 된다. 이 때 sudo 명령어를 사용하여 실행하였다. sudo를 사용하여 root권한을 얻기위해 사용자(여기서는 wyjung)의 암호 입력을 요구한다. 이 암호는 한번 입력하면 5분동안 sudo 명령어 입력시 사용자의 암호를 입력하지 않아도 된다. 사용자의 암호를 입력하면 sudo명령어 뒤에 작성한 내용(yum install system-config-users)가 root 권한으로 실행된다. 실행이 끝나면 다시 일반사용자 권한으로 돌아오게 된다.


[root 권한으로 전환 (sudo)]

~] $ sudo -s
[sudo] password for wyjung: 사용자암호입력
wyjung] #

sudo 명령어에 -s 옵션을 주어 실행하게 되면 사용자 암호 입력후 root 권한의 쉘으로 전환된다. 위와 같이 명령어 프롬프트에 "$"표시는 일반 사용자이고, "#" 표시는 root 사용자 프롬프트를 나타낸다.

[root 권한으로 전환 (su)]

~] $ su -
암호: root암호입력
마지막 로그인: 목  7월 17 18:58:04 KST 2014 일시 pts/1
~] #

su 명령어에 - 옵션을 주어 실행하고 root 사용자의 암호를 이력하게되면 root로 사용자로 전환된다. 여기서 - 옵션을 빼고 입력할 경우 root 사용자의 환경변수를 읽어오지 않아 root 전용 명령어를 찾지 못하는 경우가 발생된다. sudo로 전환했을 때와 다른것은 root 사용자로 전환과 동시에 root 사용자의 홈디렉토리로 현재 디렉토리가 바뀐다는 것이다.


[다른 사용자로 전환]

~] $ sudo -s -u doly
[sudo] password for wyjung: 사용자암호입력
wyjung] $ id
uid=1000(doly) gid=1000(doly) groups=1000(doly),10(wheel),1001(wyjung) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023


sudo명령어에 -u 옵션을 사용하여 전환 하고자 하는 사용자를 지정하면 지정된 사용자로 전환할 수 있다. 위 예는 wyjung 사용자가 doly 사용자로 전환한 것이다.
  사용자 전환 후 전환하기 전 사용자로 돌아오기 위해서는 exit를 입력하면 된다.

[디스크 쿼터 설정]

[쿼타(Quota)설정]
쿼타는 디스크의 용량 및 아이노드 수(파일 및 디렉토리 수)를 사용자, 그룹별로 제한하기 위해 사용된다. CentOS 7에서 기본파일시스템으로 제공되는 xfs의 경우 사용자, 그룹뿐만 아니라 프로젝트, 디렉토리별로 제안할 수 있어 유용하게 사용된다. 
홈페이지를 만들어 웹호스팅 서비스에 가입하면 디스크용량을 제한적으로 제공한다. 이 때 쿼타가 사용되는 것이다. 또, 여러 사용자가 파일 저장용도로 서버를 사용할 때 한 사용자가 모든 공간을 사용하지 못하도록 나누기위해 사용된다.


먼저 CentOS 7의 기본 파일시스템인 xfs에서 쿼타 설정에 대해 알아보고, 예전방식의 쿼타에 대해 알아보도록 하자.


[XFS 쿼타(Quota)]
CentOS7부터는 기본파일시스템으로 xfs가 사용된다. xfs에서 제공하는 쿼타는 사용자, 그룹뿐만 아니라 프로젝트, 디렉토리별로 제안할 수 있다. 하지만, 일반적인 쿼타 설정법과는 다르다.
예전방식에서 제공되는 쿼타는 사용자, 그룹을 기준으로 용량 및 파일수를 제안할 수 있었다. 그래서 웹서비스를 제공하기에 불편한점이 있었다. Apache 웹서버의 경우 nobody 또는 daemon 사용자권한으로 작동한다. 웹을 사용하여 파일을 업로드 하는 경우 nobody 또는 daemon 사용자 소유가 되어 쿼타에서 사용되는 용량으로 측정되지 않았다. 이러한 부분을 해결하기 위해 각 사용자의 권한으로 Apache 웹서버를 실행되도록 하였지만, 이는 보안에 취약하였다. xfs 쿼타의 디렉토리별 제한은 이러한 문제를 해결해 준다.

[마운트 옵션 설정 : /etc/fstab]
쿼터를 사용하기 위해서는 파일시스템 마운트 과정에서 옵션을 넣어야 한다. 마운트 옵션은 다음과 같다. 


xfs 쿼타관련 마운트옵션은 제한는 하는 경우와 제한은 하지 않고 모니터링을 위해 사용하는 각 2가지 옵션을 제공한다. 웹호스팅의 경우 제한을 하게되면 웹사이트 장애까지 유발할 수 있어 제한은 하지 않고 모니터링만 하기도 한다. 그룹쿼타와 프로젝트 쿼타는 동시에 사용할 수 없다.

서버 부팅될 때 파일시스템 마운트옵션을 넣기 위해 /etc/fstab에 다음 내용을 추가한다.

/dev/mapper/centos-data /data          xfs     uquota,pquota,defaults      0 0

위 내용은 이미 생성된 /dev/mapper/centos-data 볼륨을 /data 디렉토리에 마운트한다. /dev/mapper/centos-data 볼륨은 xfs 파일시스템으로 포맷되어 있어야 한다. 마운트 옵션으로 사용자쿼타(uquota), 프로젝트쿼타(pquota)옵션을 추가하였다.
/data 디렉토리르 생성하고 /etc/fstab 설정 내역에 따라 마운트 해보자.

~] # mkdir /data
~] # mount /data

만약 이미 마운트가 되어 있다면 다음과 같이 다시 마운트를 한다.

~] # mount -o remount /data

마운된 내용을 확인한다.

~] # mount |grep data
/dev/mapper/centos-data on /data type xfs (rw,relatime,attr2,inode64,usrquota,prjquota)

앞에서 설정한 uquota(usrquota), pquota(prjquota)옵션이 설정된 것을 확인하였다.

[사용자 쿼타 설정]
앞에서 쿼타를 사용할 파티션이 준비되었다면 사용자 쿼타를 설정해 보자. xfs 파일시스템의 쿼타는 xfs_quota 명령어를 이용하여 설정하거나 확인한다. xfs_quota는 기본적으로 대화형 환경을 제공한다. 다음은 xfs_quota 명령어 실행 후 help를 입력하여 사용법을 확인한 것이다.

~] # xfs_quota
xfs_quota> help
df [-bir] [-hn] [-f file] -- show free and used counts for blocks and inodes
help [command] -- help for one or all commands
print -- list known mount points and projects
quit -- exit the program
quota [-bir] [-gpu] [-hnNv] [-f file] [id|name]... -- show usage and limits

Use 'help commandname' for extended help.

사용법을 확인해 보아도 별 내용이 없어 보인다. xfs_quota 명령은 일반 사용자도 사용할 수 있다. 기본적으로 쿼타 설정된 내용을 각 사용자가 확인하기 위해 사용하며, 설정을 하기 위해서는 -x 옵션을 사용하여 전문가 모드로 접근하여 설정한다. 일반 사용자도 -x 옵션을 사용할 수 있지만 대부분의 명령이 실행되지 않는다.

~] # xfs_quota   -x
xfs_quota> help
df [-bir] [-hn] [-f file] -- show free and used counts for blocks and inodes
disable [-gpu] [-v] -- disable quota enforcement
dump [-gpu] [-f file] -- dump quota information for backup utilities
enable [-gpu] [-v] -- enable quota enforcement
help [command] -- help for one or all commands
limit [-gpu] bsoft|bhard|isoft|ihard|rtbsoft|rtbhard=N -d|id|name -- modify quota limits
off [-gpu] [-v] -- permanently switch quota off for a path
path [N] -- set current path, or show the list of paths
print -- list known mount points and projects
project [-c|-s|-C|-d <depth>|-p <path>] project ... -- check, setup or clear project quota trees
quit -- exit the program
quot [-bir] [-gpu] [-acv] [-f file] -- summarize filesystem ownership
quota [-bir] [-gpu] [-hnNv] [-f file] [id|name]... -- show usage and limits
remove [-gpu] [-v] -- remove quota extents from a filesystem
report [-bir] [-gpu] [-ahnt] [-f file] -- report filesystem quota information
restore [-gpu] [-f file] -- restore quota limits from a backup file
state [-gpu] [-a] [-v] [-f file] -- get overall quota state information
timer [-bir] [-gpu] value -d|id|name -- get/set quota enforcement timeouts
warn [-bir] [-gpu] value -d|id|name -- get/set enforcement warning counter

Use 'help commandname' for extended help.

전문가 모드에서는 설정할 수 있는 부분이 보인다. 

또는 다음과 같이 -c 옵션을 사용하여 비대화형 모드로 명령을 내릴 수 있다.

[root@localhost ~]# xfs_quota -x -c 'df' /data
Filesystem           1K-blocks       Used  Available  Use% Pathname
/dev/mapper/centos-data
                      31441920      32940   31408980    0% /data

다음과 같이 설정해 보자.

1. 사용자 쿼타 설정
먼저 설정할 파일시스템을 선택한다. path를 입력하여 파일시스템 리스트를 확인하고, path 아이디를 입력하여 파일시스템을 선택한다. 우리는 /data 파일 시스템을 선택하기 위해 path 001을 입력한다.

~] # xfs_quota -x
xfs_quota> path
      Filesystem          Pathname
[000] /                   /dev/mapper/centos-root
 001  /data               /dev/mapper/centos-data (uquota, pquota)
 002  /boot               /dev/vda1
xfs_quota> path 001
      Filesystem          Pathname
 000  /                   /dev/mapper/centos-root
[001] /data               /dev/mapper/centos-data (uquota, pquota)
 002  /boot               /dev/vda1
xfs_quota> limit  -u  bsoft=1g  bhard=1126m  isoft=1000  ihard=1100   doly

다음으로 limit 를 입력하여 각 항목에 대해 설정한다.
  -u : 사용자 쿼타 설정
  bsoft : 블록 soft 제한 용량 (단위는 k, m, g, t 사용가능, 정수만 가능)
  bhard : 블록 hard 제한 용량
  isoft : 아이노드 soft 제한
  ihard : 아이노드 hard 제한
  doly : 제한 할 사용자 

쿼타 설정을 하기위해서는 limit를 사용한다. 다음과 같이 help limit로 사용법을 확인할 수 있다.

~] # xfs_quota -x
xfs_quota> help limit
limit [-gpu] bsoft|bhard|isoft|ihard|rtbsoft|rtbhard=N -d|id|name -- modify quota limits

 modify quota limits for the specified user

 Example:
 'limit bsoft=100m bhard=110m tanya

 Changes the soft and/or hard block limits, inode limits and/or realtime
 block limits that are currently being used for the specified user, group,
 or project.  The filesystem identified by the current path is modified.
 -d -- set the default values, used the first time a file is created
 -g -- modify group quota limits
 -p -- modify project quota limits
 -u -- modify user quota limits
 The block limit values can be specified with a units suffix - accepted
 units are: k (kilobytes), m (megabytes), g (gigabytes), and t (terabytes).
 The user/group/project can be specified either by name or by number.

제한을 할 수 있는 항목은 블록, 아이노드, 실시간 블록 제한이 있다. 실시간 블록 제한(rtbsoft, rtbhard)는 CentOS 7에는 구현되지 않아 사용될 수 없다.

2. 설정내역을 확인

[root@localhost ~]# xfs_quota  -x  -c   'report -b'   /data
User quota on /data (/dev/mapper/centos-data)
                               Blocks
User ID          Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
root                0          0          0     00 [--------]
doly                0    1048576    1153024     00 [--------]

[root@localhost ~]# xfs_quota -x -c 'report -i' /data
User quota on /data (/dev/mapper/centos-data)
                               Inodes
User ID          Used       Soft       Hard    Warn/ Grace
---------- --------------------------------------------------
root                3          0          0     00 [--------]
doly                0       1000       1100     00 [--------]

report를 사용하여 블록 및 아이노드 사용량 제한설정을 확인할 수 있다.


[프로젝트 쿼타 설정]
원하는 디렉토리를 묶어 특정 디렉토리 단위로 쿼타설정을 할 수 있는 프로젝트 쿼타를 설정해 보도록 하자. 

위와 같이 2개의 디렉토리를 proj1이라는 이름으로 프로젝트 쿼타 설정을 해보도록 하자.

1. /etc/projects 파일 생성
  /etc/projects 파일은 존재하지 않으며, 생성하여야 한다. 다음과 같이 프로젝트에 사용될 디렉토리를 작성작성한다.

1:/data/proj1
1:/data/proj2

숫자:디렉토리 형식으로 작성한다. 위 설정은 1이라는 프로젝트 ID에 2개의 디렉토리를 할당하는 것이다.

2. /etc/projid 파일 생성
  /etc/projid 파일은 존재하지 않으며, 생성하여야 한다. 다음과 같이 프로젝트에 ID와 이름을 매핑한다.

proj1:1

프로젝트이름:숫자 형식으로 작성한다. 위 설정은 프로젝트 ID 1의 이름을 proj1으로 할당하는 것이다.

3. 프로젝트 쿼타 설정

[root@localhost ~]# xfs_quota -x -c 'project -s proj1' /data
Setting up project proj1 (path /data/proj1)...
Setting up project proj1 (path /data/proj2)...
Processed 2 (/etc/projects and cmdline) paths for project proj1 with recursion depth infinite (-1).

앞에서 설정한 프로젝트 이름(proj1)으로 프로젝트를 생성하였다. 생성 과정에서 앞에서 등록한 디렉토리가 설정되는 것을 확인할 수 있다.

4. 프로젝트 제한 설정

[root@localhost ~]#  xfs_quota -x -c 'limit -p bsoft=1g bhard=1126m isoft=1000 ihard=1100 proj1' /data

사용자 쿼타와 비슷하게 쿼타 설정을 한다. 단, 프로젝트 쿼타는 -u 대신 -p 옵션을 사용하였고, 사용자 이름 대신 프로젝트 이름이 사용되었다.

5. 쿼타 설정 확인

[root@localhost ~]# xfs_quota -x -c 'report -p' /data
Project quota on /data (/dev/mapper/centos-data)
                               Blocks
Project ID       Used       Soft       Hard    Warn/Grace
---------- --------------------------------------------------
proj1               0    1048576    1153024     00 [--------]


[root@localhost ~]# xfs_quota -x -c 'report -p -i' /data
Project quota on /data (/dev/mapper/centos-data)
                               Inodes
Project ID       Used       Soft       Hard    Warn/ Grace
---------- --------------------------------------------------
proj1               2       1000       1100     00 [--------]

report를 사용하여 쿼타 설정 내역 및 사용 내역을 확인할 수 있다.

6. 프로젝트 쿼타 디렉토리 확인

[root@localhost ~]# xfs_quota -x -c 'path'
      Filesystem          Pathname
[000] /                   /dev/mapper/centos-root
 001  /data               /dev/mapper/centos-data (uquota, pquota)
 002  /boot               /dev/vda1
 003  /data/proj1         /dev/mapper/centos-data (project 1, proj1)
 004  /data/proj2         /dev/mapper/centos-data (project 1, proj1)

등록된 프로젝트의 디렉토리는 위와 같이 path 명령어로 쉽게 확인할 수 있다.

다음과 같은 방법으로 각 디렉토리 사용량을 확인할 수 있다.

[root@localhost proj1]# xfs_quota -x -c 'df' /data
Filesystem           1K-blocks       Used  Available  Use% Pathname
/dev/mapper/centos-data
                      31441920     557180   30884740    2% /data
/dev/mapper/centos-data
                       1048576     524224     524352   50% /data/proj1
/dev/mapper/centos-data
                       1048576     524224     524352   50% /data/proj2


[firewalld]
CentOS7부터 많은 부분이 통합되고 추상화 되었다. CentOS6까지 방화벽 설정파일을 변경하고 iptables 서비스를 재시작하여 방화벽 규칙을 설정하였다면, CentOS7은 방화벽 규칙을 관리하는 데몬(firewalld)가 작동되고 이 방화벽 데몬이 제공하는 DBUS API를 통해 방화벽을 제어한다. GUI환경에서는 firewall-config를 이용하여 방화벽설정을 할 수 있으며, CUI환경에서는 firewall-cmd를 이용하여 방화벽 설정을 할 수 있다. 방화벽을 제어하려는 별도 어플리케이션을 개발할 때도 filrewalld API를 사용하면 설정파일 변경에 따른 각 방화벽 관리 어플리케이션과의 충돌을 피할 수 있다. 
firewalld에서 사용되는 용어, GUI 프로그램인 firewall-config, CUI 프로그램인 firewall-cmd에 대해 알아보겠다.


[firewalld에서 사용되는 용어]
일반적인 서비스 오픈을 위해서는 앞에서 설명한 정도 방화벽 사용법을 알면 될 것이다. CentOS7에서 도입된 firewalld에 대해 자세히 보면 런타임, 영구적, 영역, 서비스등의 용어들이 사용되는 것을 알 수 있다.

① 설정 : 런타임(run time)
런타임(실행시간)에만 설정한다는 것이다. 즉, 설정 내역이 메모리에 상주되어 있어 적용은 되지만, Firewalld를 다시 불러오거나, 시스템을 재시작 하면 설정된 내역은 지워지게 된다. 

② 설정 : 영구적(permanent)
영구적으로 설정한다는 것이다. 즉, Firewalld를 다시 불러오는 경우 영구적으로 설정된 내역에서 불러오고, 시스템 재시작시 영구적 설정에서 불러와 방화벽을 설정하게 된다. 앞의 http, https 허용 예에서도 영구적 설정을 하였다. 런타임 설정내역을 저장할 수 있는 방법을 제공하지 않기 때문에 영구적 설정으로 관리하는 것이 효율적이다.

③ 영역(zone)
네트워크 연결 신뢰도에 따라 영역을 구분하여 사용할 수 있다. 기본 영역은 public이며 영역을 추가/편집/삭제(일부영역 편집/삭제 불가)할 수 있다. 이 영역을 활용하면 네트워크 상황에 따라 여러 가지 잘 정의된 방화벽룰을 효율적으로 사용할 수 있다. 예를 들면 일반적인 환경에서는 public영역을 초기 구축 단계에서 모든 접속을 허용해야 할 경우 trusted영역을, 시스템 운영중 외부접속 차단을 위해 work영역 또는 drop, block영역을 사용할 수 있다. 
기본적으로 정의된 영역에 대해 알아보자.





[참 고]
REJECT와 DROP
방화벽 설정에서 패킷을 거부(reject) 또는 폐기(drop)할 수 있다. 거부와 폐기의 차이는 다음과 같다.
REJECT(거부) : 패킷을 받으면 거부한다는 ICMP패킷을 보내게 된다. 기본은 port-unreachable이며 icmp-net-unreachable,   icmp-host-unreachable,   icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited, icmp-admin-prohibited등을 선택해서 거부할 수 있다.
DROP(폐기) : 패킷을 받으면 아무런 응답을 하지 않고 버린다.

④ 서비스(service)
각 서비스별 정의된 프로토콜, 포트, 모듈, 목적지에 대해 정의가 된 서비스이다. 여기서 서비스는 /etc/service에 명시된 내용과는 조금 다르다. 
firewalld의 서비스는 /usr/lib/firewalld/services/*.xml 파일에 명시되어 있다. 여러 서비스 중 ftp 서비스 파일(ftp.xml) 내용을 살펴보자.

~]# cat /usr/lib/firewalld/services/ftp.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>FTP</short>
  <description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
  <port protocol="tcp" port="21"/>
  <module name="nf_conntrack_ftp"/>
</service>

위 내용을 보면, FTP 서비스에 대한 설명과 프로토콜(tcp), 포트(21)가 명시되어 있고, FTP passive 모드를 위해 사용하는 nf_conntrack_ftp 모듈이 설정되어 있다. FTP 서비스를 선택하게되면 nf_conntrack_ftp 모듈이 로드된다


[방화벽 CUI 설정 (firewall-cmd)]
firewalld의 CUI인터페이스인 firewall-cmd에 대해 알아보기 이전에 웹서버를 운영하기 위해 HTTP, HTTPS 포트를 허용하는 방법에 대해 알아보자.

터미널 창에서 다음과 같이 입력한다.

~]# firewall-cmd   --permanent   --add-service=http   --add-service=https
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default)
  interfaces:
  sources:
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules:

firewall-cmd명령을 사용하여 위와 같이 룰을 추가할 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-service 옵션을 사용하여 오픈하고자 하는 서비스를 지정한다. 만약 이미 추가된 서비스를 제거하기 위해서는 --remove-service 옵션을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 설정된 룰을 확인한다.

방화벽 오픈 여부를 위해 다른 리눅스 컴퓨터에서 다음과 같이 확인해 보자.

~]#  nmap 192.168.0.201 -p 443,80,22,25

Starting Nmap 5.21 ( http://nmap.org ) at 2015-03-24 19:57 KST
Nmap scan report for 192.168.0.201
Host is up (0.00041s latency).
PORT    STATE    SERVICE
22/tcp  open     ssh
25/tcp  filtered smtp
80/tcp  closed   http
443/tcp closed   https

Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

nmap명령어를 방화벽 설정 내역을 확인할 수 있다. 22/tcp(SSH)는 오픈된 것이 확인되고, 25/tcp(SMTP)는 filtered되었다. 웹서비스 포트 80/tcp(HTTP), 443/tcp(HTTPS)는 방화벽에서 차단된 것은 아니지만 닫혀 있다고 나타난다. 

[참 고]
firewall-cmd 자동완성 기능
CentOS7의 통합된 명령어들은 자동완성 기능을 제공한다. 자동완성이란 옵션의 몇몇 단어만 입력하고 <TAB>키를 누르게 되면 관련 옵션의 단어가 자동완성된다. 또 여러개의 가능한 옵션이 있을때는 <TAB>키를 여러번 누르면 옵션 리스트가 나타난다. 아래와 같이 옵션을 모를 때는 <TAB>키를 여러번 누르면 사용할 수 있는 옵션 리스트가 나타난다.

~]#  firewall-cmd --permanent --
--add-forward-port=                   --list-rich-rules
--add-icmp-block=                     --list-services
--add-interface=                      --list-sources
--add-lockdown-whitelist-command=     --query-forward-port=
... 

[영역(zone) 변경]
앞에서 설명한 영역(zone)은 다음과 같은 방법으로 변경할 수 있다.

~]#  firewall-cmd --set-default-zone=block
success

기본 영역을 block으로 변경하였다. 설정 가능한 영역은 영역값을 입력하지 않고 <TAB>키를 여러번 누르면 다음과 같이 확인할 수 있다.

~]#  firewall-cmd --set-default-zone=<TAB><TAB>
block     dmz       drop      external  home      internal  public    trusted   work

설정된 내역은 다음과 같이 확인할 수 있다.

~]#  firewall-cmd --list-all
block (default, active)
  interfaces: eth0
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

위 결과를 보면 기본영역이 block으로 변경된 것을 확인할 수 있다. 물론 --get-default-zone 옵션으로 기본영역을 확인할 수 있다.

[서비스(service) 수정]
GUI와 다르게 firewall-cmd는 서비스 추가/수정 방법을 제공하지 않는다. 다음과 같은 방법으로 미리 정의된 서비스를 편집하여 사용할 수 있다. 리눅스 서버 접속을 위해 SSH를 가장 많이 사용한다. 많이 사용되는 만큼 인터넷에 공개된 서버의 경우 사전(dictionary) 공격을 통해 접속정보를 획득하려는 시도가 많이 일어난다. 이러한 접근 시도를 회피하기 위해 SSH 기본포트(tcp/22)를 1024이후 잘 알려지지 않은 포트로 변경한다. 이러한 경우 SSH 서비스에 대한 서비스 포트 또한 변경이 되어야 하기에 다음과 같이 방화벽 설정을 변경해 보도록 하자.

~]#  cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/

서비스가 정의된 파일(ssh.xml)을 /usr/lib/firewalld/services 디렉토리에서 /etc/firewalld/services 디렉토리로 복사한다.
/etc/firewalld/services/ssh.xml 파일을 열어 다음과 같이 수정한다.

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="15322"/>
</service>

필자는 SSH포트로 15322를 입력하였다.

~]#  firewall-cmd --reload
success
--reload옵션으로 변경내역을 반영한다. 

~]#  iptables -nL |grep 15322
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0      tcp dpt:15322 ctstate NEW

firewall-cmd으로는 서비스의 변경내역을 확인할 수 없었다. iptables명령을 사용하여 변경된 서비스 포트를 확인하였다.

[포트 및 프로토콜 직접 추가]
앞에서 다뤘던 서비스를 이용하여 방화벽을 관리하기도 하지만, 앞 예와 같이 미리 정의된 서비스의 포트를 변경하는 경우는 포트 및 프로토콜을 직접 추가하는 것이 방화벽 관리에 더 효율적이다. SSH 포트를 변경한 경우 서비스 리스트에서는 바로 확인하기 어렵기 때문에 서버를 이전하는 경우 실수할 수 있다. 
 VNC접속을 위해 포트 및 프로토콜을 직접 추가해 보도록 하자.

~]# firewall-cmd --permanent --add-port=5900-5910/tcp
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources: 
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

firewall-cmd명령을 사용하여 위와 같이 룰을 추가할 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-port 옵션을 사용하여 오픈하고자 하는 포트 및 포트범위/프로토콜을 지정한다. 만약 추가된 포트를 제거하기 위해서는 --remove-port 옵션을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 설정된 룰을 확인한다. 물론 추가된 포트는 --list-ports 옵션으로 확인 가능하다.

[마스커레이딩(Masquerading)]
리눅스 시스템을 인터넷 공유 목적의 라우터 기능을 사용하기 위해 마스커레이딩 기능을 활성화 시킨다. 
마스커레이딩을 사용하기 위해 공인망, 사설망 네트워크 구성을 미리 해 두어야 한다.

~]# firewall-cmd --permanent --add-masquerade
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: yes
  forward-ports: 
  icmp-blocks: 
  rich rules:

firewall-cmd명령을 사용하여 위와 같이 마스커레이딩을 활성화 시킬 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-masquerade 옵션을 사용 마스커레이딩을 활성화시킨다. 만약 마스커레이딩을 비활성화시고 싶다면 --remove-masquerade 옵션을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 masquerade 활성화 유부를 확인한다. 

[포트 포워딩(port forwarding)]
앞에서 마스커레이딩 설정으로 인터넷 공유 라우터를 설정한 경우 외부에서 공인IP로 접속되는 연결에 대해서 포트에 따라 내부 서버로 연결시킬 수 있는 포트 포워딩 기능을 사용할 수 있다. 
또, 시스템으로 들어오는 포트를 포워딩하여 로컬의 다른 포트로 포워딩할 수 있다. 시스템의 각 서비스들은 보안을 위해 일반 사용자 권한으로 서비스를 실행하기를 권장한다. 예를 들어 Tomcat은 JSP 컨테이너이면서 웹서버 기능을 가지고 있다. Tomcat은 일반 사용자 계정으로 실행할 것을 권장한다. 하지만, HTTP기본포트 80을 사용할 경우 root권한이 아니면 80포트를 Bind할 수 없다. 이러한 경우 포트포워딩을 사용하여 80포트로 접속되는 패킷을 로컬의 8080(Tomcat의 기본 HTTP 포트)포트로 포워딩 시킴으로 root권한 없이 80포트를 사용하여 웹서비스를 할 수 있다.
80포트로 접속되는 패킷을 8080포트로 포워딩 설정해 보자.

~]# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: yes
  forward-ports: port=80:proto=tcp:toport=8080:toaddr=
  icmp-blocks: 
  rich rules:

firewall-cmd명령을 사용하여 위와 같이 포트 포워딩 하였다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-forward-port 옵션을 사용 포트 포워딩 규칙을 추가하였다. 다음과 같은 방법으로 입력된다.
--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
만약 포트포워딩을 제거하기 위해서는 --remove-forward-port 옵션을 사용한다.다음과 같은 방법으로 입력된다.
--remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 포트포워딩 설정내역을 확인할 수 있다. 물론 --list-forward-ports 옵션으로 확인할 수 있다.

[ping 응답 하지 않기]
시스템의 네트워크 상태를 확인하기 위해 ping명령어를 이용하여 응답 테스트를 한다. ping은 네트워크 확인을 위해 유용하게 사용되지만, 악의적으로 패킷크기를조절하여 네트워크의 과다한 트래픽을 유발하기도 한다. 이러한 공격을 차단하기 위해 ping에 대해 응답하지 않도록 설정하는 경우가 있다. 
다음은 ICMP 프로토콜 중 ping에 대해 응답하지 않게 설정하고 있다.

~]# firewall-cmd --permanent --add-icmp-block=echo-request
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: yes
  forward-ports: port=80:proto=tcp:toport=8080:toaddr=
  icmp-blocks: echo-request
  rich rules:

firewall-cmd명령을 사용하여 위와 같이 ping을 차단할 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-icmp-block 옵션을 사용 ICMP 차단할 유형을 추가하였다. 만약 차단할 유형을 제거하기 위해서는 --remove-icmp-block옵션을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 차단된 ICMP 유형을 확인할 수 있다. 물론 --list-icmp-blocks 옵션으로도 확인할 수 있다.

[직접 방화벽 규칙 넣기]
리눅스 방화벽 iptables는 막강한 확장기능을 제공한다. firewalld에서 제공되는 기능은 확장 기능 중 일부만 사용할 수 있으며, 원하는 확장 기능 사용을 위해 다음과 같은 방법으로 직접 입력하여 사용할 수 있는 인터페이스가 제공된다.
웹서버를 대상으로 DOS공격이 많이 발생된다. 특정 클라이언트 IP에서 접속이 많이 발생된다면 특정 클라이언트 IP 차단을 위해 사용하는 모듈이 connlimit이다. 
다음은 connlimit를 사용하여 DOS공격을 막도록 설정해 보겠다.

~]# firewall-cmd --permanent --direct --add-passthrough ipv4 -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 -j REJECT
success
~]# firewall-cmd --reload
success

firewall-cmd명령을 사용하여 DOS공격을 막을 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --direct 옵션은 직접 입력한다는 설정이다. --add-passthrough는 통과 규칙을 직접 입력하는 옵션이다. 만약 통과 규칙을 제거하기 위해서는 --remove-passthrough을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 

~]# iptables -nL |grep conn
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 flags:0x17/0x02 #conn src/32 > 16 reject-with icmp-port-unreachable

firewall-cmd으로는 직접 설정한 규칙 확인이 어려워 iptables명령을 사용하여 직접 추가한 규칙을 확인하였다.


+ Recent posts