RHCE 자격증 시험 문제을 알아보도록 하겠습니다. 레드햇 RHCE는 Red Hat Certified Engineer의 약자로, Red Hat Enterprise Linux 시스템을 관리하고 네트워크 서비스를 구축하고 자동화할 수 있는 능력을 인증하는 자격증입니다. RHCE 시험은 다음과 같은 내용을 포함합니다.

  • 방화벽, 포트포워딩, ipv6 설정
  • 원격파일시스템 (NFS, SAMBA, iSCSI)
  • 아파치 웹서버, 쉘스크립트, mariadb
  • SELinux, Teaming, Postfix

RHCE 시험은 100% 실기 시험으로, 서버와 클라이언트 두 대의 가상 머신을 사용하여 문제를 풀어야 합니다. 시험 시간은 3시간 30분이며, RHCSA 자격증을 이미 취득한 사람만 응시할 수 있습니다. 시험 점수는 300점 만점 중 210점 이상이어야 합격입니다.

RHCE 시험을 준비하려면 Red Hat에서 제공하는 공식 교육 과정을 이수하거나, 독학을 통해 필요한 지식과 기술을 습득해야 합니다. RHCE 시험은 실무에서 잘 쓰지 않는 문제도 많이 출제되므로, 단순히 명령어를 외우는 것보다는 원리와 개념을 이해하고 응용할 수 있어야 합니다. 또한, 반복적인 실습을 통해 손에 익히는 것이 중요합니다.

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

레드햇 RHCE 자격증 시험 환경

  • system1.example.com:
    • IP 주소: 192.168.122.100
    • 서브넷 마스크: 255.255.255.0
    • 네트워크: 192.168.122.0/24
  • system2.example.com:
    • IP 주소: 192.168.122.200
    • 서브넷 마스크: 255.255.255.0
    • 네트워크: 192.168.122.0/24
# ssh -X root@system1.example.com
# iptables -F
# systemctl mask iptables
# mask ip6tables
# mask ebtables

# ssh -X root@system2.example.com
# iptables -F
# systemctl mask iptables
# mask ip6tables
# mask ebtables

SELinux enforcing 모드 설정

  • system1과 system2 모두 SELinux는 반드시 enforcing 모드로 동작해야 합니다.

아래는 SELinux를 enforcing 모드로 설정하는 단계입니다:

SELinux(보안 강화된 Linux)를 enforcing 모드로 설정하는 것은 시스템에서 SELinux 정책을 활성화하여 보안을 강화하는 것입니다. SELinux는 액세스 제어 및 권한 부여를 강화하여 시스템의 안전성을 높이는 데 사용됩니다.

# sestatus (# getenforce)
# vi /etc/selinux/config (# vi /etc/sysconfig/selinux)
SELINUX=enforcing
# setenforce 1

다음은 SELinux를 enforcing 모드로 설정하는 간단한 방법입니다.

현재 SELinux 상태 확인

먼저 현재 SELinux 상태를 확인합니다.

sestatus

SELinux를 enforcing 모드로 변경

만약 현재 SELinux가 permissive 모드라면, enforcing 모드로 변경합니다.

sudo setenforce 1

설정 변경 영구화

위의 명령으로 설정을 변경하면 현재 세션에만 적용되며, 시스템을 다시 부팅하면 원래의 설정으로 돌아갈 수 있습니다. 영구적으로 enforcing 모드로 설정하려면 설정 파일을 수정해야 합니다.

sudo nano /etc/selinux/config

파일에서 SELINUX= 라인을 찾아 enforcing으로 변경합니다.

SELINUX=enforcing

파일을 저장하고 나가면 변경이 적용됩니다.

재부팅

마지막으로 시스템을 재부팅하여 SELinux 설정을 적용합니다.

sudo reboot

이러한 단계를 system1.example.com과 system2.example.com 양쪽에서 반복하여 두 시스템 모두에서 SELinux가 enforcing 모드로 동작하도록 합니다.

리눅스 포트포워딩 설정

포트포워딩 설정을 올바르게 구성했는지 확인하기 위해 제공된 테스트를 통해 결과를 확인할 수 있습니다. 포트포워딩이 정상적으로 작동하는지 확인하려면 다음 단계를 따르세요.

주어진 요구사항에 따라 system1에서 포트포워딩을 설정하고, 이를 테스트하기 위한 과정은 다음과 같습니다.

system1에서 포트포워딩 설정

# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 forward-port port=5423 protocol=tcp to-port=80'

# firewall-cmd --reload

# firewall-cmd --list-all
 public (default, active)
 interfaces: eth0
 sources:
 services: dhcpv6-client ssh
 ports:
 masquerade: no
 forward-ports:
 icmp-blocks:
 rich rules:
 rule family="ipv4" source address="192.168.122.0/24" forward-port port="5423" protocol="tcp"
to-port="80"

or
# firewall-config
Configuration: Permanent
Zones: public
Rich Rules:
Family: ipv4
Element: forward-port
Source
Protocol: tcp
Port/Port Range: 5423
Destination
[ v ] Local forwarding
Port/Port Range: 80
Source : IP : 192.168.122.0/24
상단 > Options > reload firewalld

위 명령어들을 사용하여 192.168.122.0/24 네트워크에서 오는 트래픽 중 로컬 포트 5423을 system1의 80번 포트로 포워딩하는 방화벽 규칙을 설정하고, 이를 영구적으로 적용하고 방화벽을 리로드합니다.

system2에서 system1의 5423 포트로 웹서비스 요청 시 응답 떨어지는지 확인


[root@system1 ~]# cat > /var/www/html/index.html
hello
[root@system1 ~]# systemctl start httpd

[root@system2 ~]# curl system1.example.com
응답없음. <Ctrl><c>
[root@system2 ~]# curl system1.example.com:5423
hello

이제 system2에서 system1의 5423 포트로 curl 명령어를 사용하여 웹서비스 요청을 하면 “hello”가 반환되어야 합니다. 만약 “응답없음”이라면, 설정이 정확하지 않거나 방화벽이 올바르게 구성되지 않은 것일 수 있습니다.

테스트가 성공적으로 완료되면, system1은 192.168.122.0/24 네트워크의 시스템들이 로컬 포트 5423을 통해 자신의 80번 포트로 포워딩되도록 설정되었음을 의미합니다.

리눅스 ssh 설정

주어진 요구사항에 따라 example.com 내에서의 SSH 접근을 허용하고, 특정 클라이언트인 support.example.com(192.168.122.50/32)에서의 SSH 접근을 거부하는 방법은 다음과 같습니다.

  1. SSH 접근 허용 및 거부 설정:
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 service name=ssh accept'
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.122.50/32 drop'
# firewall-cmd --reload
# firewall-cmd --list-all
or
# vi /etc/hosts.allow
sshd: *.example.com
# vi /etc/hosts.deny
sshd: *.test.org
or
# firewall-cmd --permanent --zone=block --add-source=192.168.122.0/24
# firewall-cmd --reload
# firewall-cmd --list
or
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 service name=ssh source
address=192.168.122.0/16 invert=True accept'
# firewall-cmd --reload
# firewall-cmd --list

위 명령어들을 사용하여 다음을 설정합니다:

  • example.com 내에서의 SSH 접근을 허용하는 규칙을 추가합니다.
  • 특정 클라이언트인 support.example.com(192.168.122.50/32)에서의 SSH 접근을 거부하는 규칙을 추가합니다.
  • 변경 사항을 영구적으로 적용하고 방화벽을 리로드합니다.
  • 변경된 방화벽 설정을 확인합니다.

이제 example.com 내의 시스템에서 SSH 접근은 허용되지만, 특정 클라이언트인 support.example.com에서의 SSH 접근은 거부됩니다.

링크 통합 설정, link aggregation 구성 방법

system1.example.com의 네트워크 링크를 구성하는 방법은 다음과 같습니다. 여기서는 teaming을 사용하여 eth1과 eth2를 묶어 링크를 구성합니다.

  1. 링크 인터페이스(team0) 생성 및 구성:
# nmcli connection add con-name team0 type team ifname team0 config '{"runner": {"name": "activebackup"}}'
# nmcli con mod team0 ipv4.addresses '192.168.122.110/24'
# nmcli con mod team0 ipv4.method manual
  1. 링크에 속하는 인터페이스(slave) 설정:
# nmcli connection add con-name team0-port1 type team-slave ifname eth1 master team0
# nmcli connection add con-name team0-port2 type team-slave ifname eth2 master team0
  1. 링크 인터페이스(team0) 상태 확인:
# ip a
 team0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
 link/ether 52:54:00:83:14:55 brd ff:ff:ff:ff:ff:ff
 inet 192.168.122.110/24 brd 192.168.122.255 scope global team0
 valid_lft forever preferred_lft forever
 inet6 fe80::5054:ff:fe83:1455/64 scope link
 valid_lft forever preferred_lft forever

이제 team0 인터페이스가 생성되어 192.168.122.110 주소를 가지고 UP 상태인 것을 확인할 수 있습니다.

  1. 시스템 부팅 후에도 링크가 활성화되도록 설정:
# nmcli con mod team0 connection.autoconnect yes
# nmcli con mod team0-port1 connection.autoconnect yes
# nmcli con mod team0-port2 connection.autoconnect yes
  1. 다른 시스템(system2)에서 링크를 통한 테스트:
# ping -I team0 system1.example.com

이제 system2에서 system1의 team0 인터페이스를 통해 ping 테스트를 수행할 수 있습니다.

or
(system1)
# nmtui
or
# nmcli connection add \
type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}'
# nmcli connection modify team0 ipv4.addresses '192.168.122.10/24'
# nmcli connection modify team0 ipv4.method manual
# nmcli connection add type team-slave con-name team0-port1 ifname eth1 master team0
# nmcli connection add type team-slave con-name team0-port2 ifname eth2 master team0

# nmcli connection up team0 (필요하면 수행)
# nmcli conncetion up team0-port1 (필요하면 수행)
# nmcli conncetion up team0-port2 (필요하면 수행)
# teamdctl team0 state

(system2)
# nmtui
or
# nmcli connection add \
type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}'
# nmcli connection modify team0 ipv4.addresses '192.168.122.20/24'
# nmcli connection modify team0 ipv4.method manual
# nmcli connection add type team-slave con-name team0-port1 ifname eth1 master team0
# nmcli connection add type team-slave con-name team0-port2 ifname eth2 master team0
# nmcli connection up team0 (필요하면 수행)
# nmcli conncetion up team0-port1 (필요하면 수행)
# nmcli conncetion up team0-port2 (필요하면 수행)

# teamdctl team0 state
# ping -I team0 192.168.122.10

qstat 구성 실행, 사용자 환경 커스터마이즈

system1과 system2 양쪽에 모두 커스텀 명령인 qstat을 생성하고, 이 명령이 시스템의 모든 사용자에게 사용 가능하도록 설정하는 방법은 다음과 같습니다.

  1. qstat 명령 생성:
# vim /usr/bin/qstat

다음과 같은 스크립트를 입력하고 저장합니다:

#!/bin/bash
/bin/ps -Ao pid,ruser,fname,rsz

이 스크립트는 /bin/ps 명령어를 사용하여 PID, 사용자, 명령어, 메모리 사이즈를 표시합니다.

  1. 실행 권한 부여:
# chmod +x /usr/bin/qstat
or
# chmod 755 /bin/qstat
  1. qstat 명령을 테스트:
# qstat | head
PID RUSER COMMAND RSZ
 1 root systemd 7720
 2 root kthreadd 0

or
# qstat
or
# vi /etc/bashrc
alias qstat='/bin/ps -Ao pid,tt,user,fname,rsz'
# source /etc/bashrc
# qstat

추가 정보

  • /bin/ps 명령은 현재 실행 중인 프로세스를 표시합니다.
  • -Ao 옵션은 모든 프로세스를 표시합니다.
  • pid 필드는 프로세스 ID를 표시합니다.
  • ruser 필드는 프로세스를 실행한 사용자 이름을 표시합니다.
  • fname 필드는 프로세스의 이름을 표시합니다.
  • rsz 필드는 프로세스의 메모리 사용량을 표시합니다.

위의 과정을 system1과 system2 모두에서 수행합니다.

IPv6 주소 구성

요구사항

  • system1의 eth3에 다음 IPv6 주소를 구성하시오.
  • IPv6 Address는 fe80::5054:ff:fe46:c75f/64, Gateway는 fe80::8a51:fbff:fe67:d4d3/64
  • system1에서 fe80::8a51:fbff:fe67:d4d3/64에 네트워크 접속이 가능해야 하고 리부팅 후에도 유지되어야합니다. system2의 IPv4는 여전히 유지해야합니다
IPv6 주소 구성
IPv6 주소 구성
IPv6 주소 구성
IPv6 주소 구성

system1의 eth3에 IPv6 주소를 구성하고, 네트워크에 접속 가능하도록 설정하는 방법은 다음과 같습니다.

  1. IPv6 주소 구성:
# systemctl stop network
# systemctl stop NetworkManager
# nmcli con mod eth3 ipv6.method manual
# nmcli con mod eth3 ipv6.addresses "fe80::5054:ff:fe46:c75f/64"
# nmcli con mod eth3 ipv6.gateway "fe80::8a51:fbff:fe67:d4d3"
# systemctl start network
# systemctl start NetworkManager

위 명령어들을 사용하여 eth3 인터페이스에 대한 IPv6 주소를 수동으로 구성하고, 게이트웨이를 설정합니다. 또한, 네트워크 서비스를 재시작하여 변경사항을 적용합니다.

  1. IPv6 주소 및 게이트웨이 확인:
# ip -6 addr show dev eth3
# ip -6 route
...
fe80::/64 dev eth0 proto kernel metric 256
fe80::/64 dev eth3 proto kernel metric 256
default via fe80::8a51:fbff:fe67:d4d3 dev eth3 proto static metric 1024

이제 eth3에 대한 IPv6 주소와 게이트웨이가 설정되어 있는지 확인합니다.

  1. 네트워크 접속 확인:
# ping6 -I eth3 fe80::8a51:fbff:fe67:d4d3

이 명령은 eth3를 통해 게이트웨이에 대한 IPv6 주소로 ping을 보내어 네트워크 접속을 확인합니다.

(system1)
# nmtui
-> Edit a connection
-> eth0 선택후 Edit
IPv6 CONFIGURATION : <Manual>
Addresses : 2003:1:2:ac18::31e/64
-> Activate a connection
eth0

(system2)
# nmtui
-> Edit a connection
-> eth0 선택후 Edit
IPv6 CONFIGURATION : <Manual>
Addresses : 2003:1:2:ac18::31e/64
-> Activate a connection
eth0
# ping6 2003:1:2:ac18::31e/64

or
(system1)
# nmcli connection modify eth0 ipv6.addresses "2003:1:2:ac18::31e/64"
# nmcli connection modify eth0 ipv6.method manual
# nmcli connection up eth0 (# systemctl restart network)

(system2)
# nmcli connection modify eth0 ipv6.addresses "2003:1:2:ac18::30a/64"
# nmcli connection modify eth0 ipv6.method manual
# nmcli connection up eth0 (# systemctl restart network)
# ping6 2003:1:2:ac18::31e

위 과정을 수행하면 system1에서 eth3에 IPv6 주소가 구성되고, 네트워크 접속이 가능하며, 리부팅 후에도 설정이 유지됩니다. system2의 IPv4는 여전히 유지됩니다.

NFS 서버 구성

  • example.com에서만 read only 접근할 수 있도록 /public 디렉토리를 export하시오.
  • example.com에서만 read/write 접근할 수 있도록 /protected 디렉토리를 export하시오.
  • /protected 디렉토리는 john 소유의 secret이라는 이름의 하위 디렉토리를 포함합니다.
  • john은 /protected/secret에 대하여 반드시 read/write 권한을 가져야 합니다.

NFS 서버를 구성하여 example.com에서만 /public 디렉토리에 대한 read-only 접근 및 /protected 디렉토리에 대한 read/write 접근을 제공하고, /protected 디렉토리 내의 secret 디렉토리를 john이 소유하도록 설정하는 방법은 다음과 같습니다:

  1. 디렉토리 및 권한 설정:
# mkdir /public /protected
# mkdir /protected/secret
# chown john /protected/secret/
# ls -ld /protected/secret/
drwxr-xr-x. 2 john root 6 2월 5 05:50 /protected/secret/
  1. /etc/exports 파일 수정:
# vim /etc/exports

다음과 같은 내용을 추가하고 저장합니다:

/public *.example.com(ro)
/protected/secret *.example.com(rw,sync)

위 설정은 /public은 read-only로, /protected/protected/secret는 example.com에서만 read/write로 설정합니다.

  1. NFS 서비스 시작 및 활성화:
# systemctl start nfs-server
# systemctl enable nfs-server
  1. 방화벽(Firewall) 구성:

NFS를 사용하기 위해서는 방화벽에서 필요한 포트를 열어주어야 합니다. 기본적으로 NFS는 2049번 포트를 사용합니다.

# firewall-cmd --permanent --add-service=nfs
# firewall-cmd --reload

이제 NFS 서버는 /public 디렉토리는 example.com에서만 읽기, /protected/protected/secret 디렉토리는 example.com에서만 읽기/쓰기로 제공됩니다. /protected/secret는 john에게만 읽기/쓰기 권한이 부여됩니다.

NFS 클라이언트 구성

  • system1.example.com에서 제공하는 NFS 공유를 마운트하도록 system2를 구성하시오.
  • /public은 /mnt/nfsmount에 반드시 마운트 되어야합니다.
  • john은 반드시 /mnt/nfssecure/secret안에 파일을 생성할 수 있어야 합니다.
  • 파일시스템은 부팅 시 자동마운트 되어야합니다.

설정한 NFS 마운트를 확인하고, john이 /mnt/nfssecure/secret 디렉토리에 파일을 생성할 수 있는지 확인하는 과정을 정리한 내용은 다음과 같습니다:

  1. 필요한 디렉토리 및 파일 생성:
# mkdir /mnt/nfsmount /mnt/nfssecure
  1. /etc/fstab 파일 수정:
# vim /etc/fstab

다음과 같은 내용을 추가하고 저장합니다:

system1.example.com:/public /mnt/nfsmount nfs defaults 0 0
system1.example.com:/protected /mnt/nfssecure nfs defaults 0 0
  1. 마운트 및 확인:
# mount -a
# mount | tail -2
system1.example.com:/public on /mnt/nfsmount type nfs4
(rw,relatime,vers=4.0,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sy
s,clientaddr=192.168.122.200,local_lock=none,addr=192.168.122.100)
system1.example.com:/protected on /mnt/nfssecure type nfs4
(rw,relatime,vers=4.0,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sy
s,clientaddr=192.168.122.200,local_lock=none,addr=192.168.122.100)

위 명령을 통해 NFS 마운트가 정상적으로 수행되었는지 확인합니다.

  1. john이 파일을 생성하는지 확인:
# su - john
[john@system2 ~]$ touch /mnt/nfssecure/secret/john.file
[john@system2 ~]$ ll /mnt/nfssecure/secret/
-rw-rw-r--. 1 john john 0 Feb 5 06:16 john.file

위 명령을 통해 john이 /mnt/nfssecure/secret 디렉토리에 john.file을 생성할 수 있는지 확인합니다. 파일이 성공적으로 생성되었다면 NFS 설정이 올바르게 적용된 것입니다.

Kerberos keytab을 사용한 NFS 보안 설정

설정한 Kerberos keytab을 사용한 NFS 보안 설정에 대한 내용을 정리한 것은 다음과 같습니다:

NFS Server 설정 (system1)

  1. Kerberos keytab 다운로드 및 저장:
# wget -O /etc/krb5.keytab http://support.example.com/data/system1.keytab
  1. /etc/exports 파일 수정:
# vim /etc/exports

다음과 같이 내용을 추가하고 저장합니다:

/public *.example.com(ro)
/protected *.example.com(rw,sec=krb5p)
  1. NFS 서비스 데몬 실행:
# systemctl start nfs-secure
# systemctl enable nfs-secure
# systemctl start nfs-server
# systemctl enable nfs-server
or (문제풀이)

(system1)

# yum -y install nfs* krb5*

# mkdir /public
# chown nfsnobody /public
# mkdir /protected
# mkdir /protected/secret

# chown userid /protected/secret
# vi /etc/exports
/public *.example.com(ro)
/protected *.example.com(rw,sec=krb5p)

# wget -O /etc/krb5.keytab http://server1.example.com/nfs/server.keytab

# vi /etc/sysconfig/nfs
RPCNFSDARGS="-V 4.2"

# systemctl restart nfs-server nfs-secure-server
# enable nfs-server nfs-secure-server

# firewall-cmd --permanent --add-service=nfs
# firewall-cmd --reload

NFS Client 설정 (system2)

  1. Kerberos keytab 다운로드 및 저장:
# wget -O /etc/krb5.keytab http://support.example.com/data/system2.keytab
  1. 자동 마운트 설정:
# vim /etc/fstab

다음과 같이 내용을 추가하고 저장합니다:

system1.example.com:/protected /mnt/nfssecure nfs defaults,v4.2,sec=krb5p 0 0
  1. 마운트 적용:
# mount -a
or (문제풀이)

(system2)
# wget -O /etc/krb5.keytab http://server1.example.com/nfs/client.keytab
# systemctl restart nfs-secure
# enable nfs-secure
# mkdir /mnt/nfsmount
# mkdir /mnt/nfssecure

# vi /etc/fstab
system1.example.com:/public /mnt/nfsmount nfs defaults 0 0
system1.example.com:/protected /mnt/nfssecure nfs defaults,v4.2,sec=krb5p 0 0

# mount -a

# echo 'test' > /mnt/nfsmount/test.txt
-> read only 파일 시스템이라고 나와야 한다.
# ssh –X lucksh@system2.example.com 암호입력
# echo "test" > /mnt/nfssecure/test.txt
-> wirte 가능해야 한다

위 과정을 통해 NFS Server와 Client 간에 Kerberos keytab을 사용한 보안 설정이 완료되었습니다. 설정이 올바르게 적용되었다면 /mnt/nfssecure 디렉토리에 마운트된 NFS 디렉토리에 접근할 수 있게 됩니다.

로컬 메일 서비스 구성

  • 다음 요구사항에 따르도록 system2에 메일서비스를 구성하시오.
  • 시스템들은 외부소스에서 수신되는 이메일을 받아들이지 않습니다.
  • 이들 시스템상의 로컬에서 발신되는 어떤 메일이든 자동으로 smtp.example.com을 경유합니다.
  • 이들 시스템에서 발신된 메일은 example.com에서 온것으로 보여집니다.
  • 로컬사용자 john@example.com으로 메일을 보내서 귀하의 구성을 테스트할 수 있습니다.
  • 메일 전송은 system1.example.com에서 john 계정으로 확인합니다.
  • 참고 : 시험 시는 smtp.example.com 시스템이 이 사용자 계정의 메일을 http://server.example.com/received/john에 넣어주도록 구성되어 있습니다.

로컬 메일 서비스 및 메일 전송 구성에 대한 내용을 정리하겠습니다.

시스템2 (system2)에서의 Postfix 구성:

  1. Postfix 메인 설정(main.cf) 파일 수정:
# vim /etc/postfix/main.cf

다음과 같이 설정을 변경하고 저장합니다:

myorigin = example.com
inet_interfaces = loopback-only
mydestination =
mynetworks = 127.0.0.0/8 [::1]/128
relayhost = [smtp.example.com]
  1. Postfix 서비스 재시작:
# systemctl restart postfix
  1. 메일 전송 테스트:
# mail -s "test" john@example.com
test
<Ctrl+D>
  1. 메일 큐 확인 및 로그 확인:
# mailq
Mail queue is empty

# tail /var/log/maillog
Feb 5 07:04:35 system2 postfix/qmgr[4410]: BB5F6620E41F: from=<root@example.com>, size=428, nrcpt=1 (queue active)
Feb 5 07:04:35 system2 postfix/smtp[4674]: BB5F6620E41F: to=<john@example.com>, relay=smtp.example.com[192.168.122.50]:25,
delay=0.17, delays=0.09/0.01/0.02/0.06, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as A96D7621D66C)
Feb 5 07:04:35 system2 postfix/qmgr[4410]: BB5F6620E41F: removed

위 명령을 통해 메일이 정상적으로 발송되었는지 확인할 수 있습니다. 메일이 성공적으로 전송되었다면 mailq 명령은 비어 있고, 로그에는 전송 로그가 기록됩니다.

이로써 system2에서의 로컬 메일 서비스 및 외부로의 메일 전송이 구성되었습니다.

  • 다음 요구 사항에 따르도록 system1, system2 양쪽 모두에 메일 서버를 구성하시오.
  • 시스템들은 외부 소스에서 수신되는 이메일을 받아들이지 않습니다. -> inet_interface = loopbackup-only, mynetworks = 127.0.0.0/8, [::1]/128
  • 시스템상의 로컬에서 발신되는 어떤 메일이든 자동으로 smtp.example.com를 경유합니다. -> relayhost = [smtp.example.com]
  • 이들 시스템에서 발신된 메일은 example.com에서 온것으로 보여집니다. -> myorign = example.com 로컬 사용자 fank로 메일을 보내서 귀하의 구성을 테스트 할 수 있습니다.
  • smtp.example.com 시스템이 이 사용자 계정의 메일을 http://server.example.com/received/frank로 넣어주도록 구성되어 있습니다.
or (문제풀이)

주의) system1, system2 모두 설정한다.
# yum -y install postfix*
------------------------------------------
# vi /etc/postfix/main.cf
99: myorign = example.com
116:inet_interfaces = loopback-only
164:mydestination =
264:mynetworks = 127.0.0.0/8, [::1]/128
317:relayhost = [smtp.example.com]
------------------------------------------
# systemctl restart postfix
# enable
------------------------------------------
# firewall-cmd --permanent --add-service=smtp
# firewall-cmd --reload
# firewall-cmd --list-all
------------------------------------------
# echo test | mail -s hello frank
-> 링크 클릭: http://server.example.com/received/frank -> 받은 메일 확인


myorign = example.com 
나가는 모든 메세지의 발신자 도메인이 회사 example.com으로 다시 쓰여지도록 null 클라이언트를 구 성한다. 

inet_interfaces = loopback-only 
postfix 메일 서버가 이메일이 루프백 인터페이스에 배달될 이메일만 수신 대기 하도록 합니다.

mydestination =  
모든 메일을 릴레이 서버로 전달하도록 null 클라이언트를 구성합니다. 이를 위해 mydestination 옵 션의 값을 빈 값으로 설정해야 합니다. 

mynetworks = 127.0.0.0/8 [::1]/128 127.0.0.0/8 IPv4 네트워크 및 [::1]/128 IPv6 네트워크에서 시작된 메시지만 serverX의 null 클라이 언트에 의해 릴레이 호스트로 전달되도록 Postfix 구성을 변경합니다. 

relayhost = [smtp.example.com] DNS 서버의 MX 레코드 조회를 방지하도록 회사 메일 서버의 호스트 이름을 대괄호로 묶어야 합니다.



SMB 서비스를 통한 디렉토리 공유

  • system1의 SMB를 다음과 같이 구성하시오.
  • 당신의 SMB 서버는 반드시 STAFF 워크 그룹의 구성원이어야 합니다.
  • 서비스는 반드시 /common 디렉토리를 공유해야 합니다. 공유이름은 반드시 common이어야합니다.
  • common 공유는 반드시 example.com 도메인 클라이언트에게만 가능해야 합니다.
  • common 공유는 반드시 브라우징(browseable)될 수 있어야 합니다.
  • 사용자 sarah는 필요한 경우 암호 hp12345로 인증하여 그 공유에 대해서 반드시 읽기 권한을 가져야합니다.

SMB (Samba) 서비스를 통한 디렉토리 공유 구성에 대한 내용을 정리하겠습니다.

System1 (서버)에서의 SMB 구성:

  1. Samba 패키지 설치 및 설정 파일 수정:
# yum -y install samba*
# vim /etc/samba/smb.conf

smb.conf 파일을 다음과 같이 수정합니다:

[global]
 workgroup = STAFF
 hosts allow = 127., 192.168.122.
...
[common]
 comment = common dir
 path = /common
 browseable = yes
 valid users = sarah

or (문제풀이)
(system1)
----------------------------------------------------------
# yum -y install samba
----------------------------------------------------------
# useradd -s /sbin/nologin opie
# smbpasswrd -a opie
# mkdir /common
# chgrp opie /common
# chmod 775
# vi /etc/samba/smb.conf
[global]
workgroup = STAFF
security = user
[common]
path = /common
hosts allow = 127. 192.168.10.
browseable = yes
valid users = opie
----------------------------------------------------------
# semanage fcontext -a -t smaba_share_t '/common(/.*)?'
# restorecon -Rv /common
----------------------------------------------------------
# systemctl restart smb nmb
# enable smb nmb
----------------------------------------------------------
# firewall-cmd --permanent --add-service=samba
# firewall-cmd --reload
----------------------------------------------------------
(system2) 에서 test
# yum -y install samba-client
# smbclient -L //system1 -U opie
# smbclient //192.168.122.101/common -U opie

valid users= sarah guru sarah와 guru유저만 공유 디렉토리에 접근할 수 있도록 허용하겠다는 의미입니다.
읽기권한은 default로 허용됨. 공유를 하게 되면 읽기 권한은 따로 설정하지 않아도 허용이 되어 있습니다.

  1. SMB 사용자 추가 및 디렉토리 관련 SELinux 설정:
# smbpasswd -a sarah
New SMB password: hp12345
Retype new SMB password: hp12345
Added user sarah.

# mkdir /common
# semanage fcontext -a -t samba_share_t '/common(/.*)?'
# restorecon -vvFR /common
# ls -Zd /common
drwxr-xr-x. root root system_u:object_r:samba_share_t:s0 /common
  1. SMB 서비스 시작 및 활성화, 방화벽 설정:
# systemctl start smb nmb
# systemctl enable smb nmb
# firewall-cmd --permanent --add-service=samba
# firewall-cmd --reload

System2 (클라이언트)에서의 테스트:

  1. smbclient를 이용한 공유 목록 확인:
# yum install -y samba-client cifs-utils
# smbclient -L //system1 -U sarah
Enter opie's password: hp12345
Domain=[STAFF] OS=[Unix] Server=[Samba 4.1.1]
 Sharename Type Comment
 --------- ---- -------
 common Disk common dir
 IPC$ IPC IPC Service (Samba Server Version 4.1.1)
 sarah Disk Home Directories
Domain=[STAFF] OS=[Unix] Server=[Samba 4.1.1]
 Server Comment
 --------- -------
 SYSTEM1 Samba Server Version 4.1.1
 Workgroup Master
 --------- -------
 STAFF SYSTEM1
  1. SMB 클라이언트를 이용한 공유 디렉토리 접근 및 목록 확인:
# smbclient //system1.example.com/common -U sarah
Enter opie's password: hp12345
Domain=[STAFF] OS=[Unix] Server=[Samba 3.6.9-151.el6]
smb: \> ls
or
(system1)
# id gump
uid=1002 gid=1002 groups=1002,2000(sales)
# id hanks
uid=1003 gid=1003 groups=1003,2000(sales)
-> salses 그룹에 gump, hanks 사용자가 속해 있는 것을 확인한다. 사용자가 없으면 추가한다.
(system1)
-----------------------------------------------
# mkdir /releases
# chgrp gump /releases
# chmod 2775 /releases -> hanks 사용자가 같이 작업을 하기 위해서 setgid 설정한다.
# vi /etc/samba/smb.conf
[releases]
path = /releases
hosts allow = 192.168.10.
browseable = yes
write list = @sales
# smbpasswd -a gump
# –a hanks
-----------------------------------------------
# semanage fcontext -a -t samba_share_t '/release(/.*)?'
# restorecon –Rv /releases
-----------------------------------------------
# systemctl restart smb nmb
# enable smb nmb
(system2)
# yum -y install cifs-utils
# mkdir /mnt/multi
# vi /root/multiuser.txt
username=gump
password=atenorth
# vi /etc/fstab
//system1/releases /mnt/multi cifs
confidentials=/root/multiuser.txt,multiuser,sec=ntlmssp 0 0
# mount -a
test 하기
# cd /mnt/multi
# cifscreds add sy

이로써 System1에서 SMB를 통한 디렉토리 공유가 성공적으로 구성되었습니다. System2에서의 테스트 결과를 확인할 수 있습니다.

SAMBA 다중사용자 SMB 공유 생성

  • system1에서 /releases 디렉토리를 다음과 같이 SMB를 통해 공유합니다.
  • 공유이름 : releases
  • releases 공유는 오직 example.com 도메인의 클라이언트들만 접근 허용되고, releases 공유는 반드시 Browseable 가능해야 합니다.
  • smb 공유는 david의 credential을 이용하여 system2.example.com에서 /mnt/multi에 지속적으로 마운트되어야 합니다.
  • david는 암호 hp12345로 인증하여 공유에 읽기/쓰기 권한으로 접근할 수 있어야 합니다.
  • 이 공유는 peter사용자의 패스워드 hp12345로 인증하면 임시로 읽기 권한을 얻을 수 있도록 해야합니다

System1 (SMB Server)에서의 설정:

  1. releases 공유 디렉토리 생성 및 관리:
System1 : SMB Server 구성
# id david
uid=1001(david) gid=1001(david) groups=1001(david),2000(sales)
# id peter
uid=1002(peter) gid=1002(peter) groups=1002(peter)

# mkdir /releases
# chgrp sales /releases
# chmod 2775 /releases

# semanage fcontext -a -t samba_share_t '/releases(/.*)?'
# restorecon -vvFR /releases
# ls -dZ /releases/
drwxrwsr-x. root sales system_u:object_r:samba_share_t:s0 /releases/
  1. Samba 설정 파일 수정 및 재시작:
# vim /etc/samba/smb.conf

smb.conf 파일을 다음과 같이 수정합니다:

[releases]
 path = /releases
 browseable = yes
 writable = yes
 write list = @sales
# systemctl restart smb nmb
  1. Samba 사용자 계정 생성 및 암호 설정:

# smbpasswd -a david
New SMB password: hp12345
Retype new SMB password: hp12345

# smbpasswd -a peter
New SMB password: hp12345
Retype new SMB password: hp12345

System2 (SMB Client)에서의 설정:

  1. CIFS 유틸리티 및 samba-client 설치:
# yum install -y cifs-utils samba-client
  1. /mnt/multi 디렉토리 생성 및 자격 증명 파일 생성:
# mkdir /mnt/multi
# vim /root/pass.txt

pass.txt 파일 내용:

username=david
password=hp12345
# chmod 600 pass.txt
# vim /etc/fstab

/etc/fstab 파일 내용:

//system1.example.com/releases /mnt/multi cifs credentials=/root/pass.txt,multiuser 0 0
  1. CIFS 마운트 및 권한 확인:
# mount -a
# mount | tail -1
//system1.example.com/releases on /mnt/multi type cifs
(rw,relatime,vers=1.0,cache=strict,multiuser,domain=SYSTEM1,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.1
22.100,unix,posixpaths,serverino,acl,noperm,rsize=1048576,wsize=65536,actimeo=1)

이로써 System1의 releases 공유를 System2에서 다중 사용자로 마운트하고 사용할 수 있습니다.


root가 생성하는 파일은 david.sales 로 저장
[root@system2 ~]# touch /mnt/multi/root.file

david는 바로저장은 못함. cifscreds로 삼바 패스워드 등록 후 파일 저장가능.
david가 생성하는 파일은 david.sales 로 저장
[root@system2 ~]# su - david
[david@system2 ~]$ touch /mnt/multi/david.file
touch: cannot touch ‘/mnt/multi/david.file’: Permission denied
[david@system2 ~]$ cifscreds add system1
Password:hp12345
[david@system2 ~]$ touch /mnt/multi/david.file
[david@system2 ~]$ exit

peter는 읽기쓰기 모두 못함. cifscreds로 삼바 패스워드 등록 후 파일 읽기는 가능해짐
[root@system2 ~]# su - peter
[peter@system2 ~]$ ls /mnt/multi
ls: cannot access /mnt/multi: Permission denied
[peter@system2 multi]$ cifscreds add system1
Password:hp12345
[peter@system2 multi]$ ls
david.file david.file2 root.file

iSCSI target 구성

  • system1이 iqn.2015-02.com.example:disk1 이라는 이름의 iSCSI 디스크 장치를 제공하도록 다음과 같이 구성하시오.
  • VirtIO로 10GiB 새 디스크를 장착한 후 이 PV를 생성하고, vg0라는 볼륨그룹을 생성하시오.
  • 3G backing volume name “storage”를 사용합니다.
  • iSCSI 서비스는 3260번 포트를 사용합니다.
  • 이 target은 system2.example.com에서만 사용가능합니다.

iSCSI Target을 구성한 것으로 보입니다. 이제 iSCSI Target을 사용할 클라이언트인 System2에서 iSCSI Target을 연결하도록 구성해야 합니다.


Disk 준비
# pvcreate /dev/vdb
# vgcreate vg0 /dev/vdb
# lvcreate -L 3G -n storage vg0
# lvs
 storage vg0 -wi-a----- 3.00g

패키지 설치
# yum -y install targetcli

서비스 실행
# systemctl start target
# systemctl enable target

방화벽 구성
# firewall-cmd --permanent --add-port=3260/tcp
# firewall-cmd --reload

iSCSC Target 구성
# targetcli
/> /backstores/block/ create disk1 /dev/vg0/storage
/> /iscsi create iqn.2014-03.com.example:disk1
/> /iscsi/iqn.2015-02.com.example:disk1/tpg1/acls/ create iqn.2015-02.com.example:system2
/> /iscsi/iqn.2015-02.com.example:disk1/tpg1/luns create /backstores/block/disk1
/> /iscsi/iqn.2015-02.com.example:disk1/tpg1/portals create 192.168.122.100
/> ls
image 15

/> exit

or (문제풀이)

# yum -y install targetcli
-----------------------------------------------------------
# fdisk -l
# fdisk /dev/vda
-> 4G (넉넉하게 잡는다)
-> 8e
# partprobe
# pvcreate /dev/vda5
# vgcreate iscsivg /dev/vda5
# lvcreate -n iscsilv -L +3G /dev/iscsivg
# targetcli
/> ls
/backstores/fileio create system1 /root/fileio.img 3G
or
/> /backstores/block create system1 /dev/iscsivg/iscsilv
/iscsi/ create iqn.2014-03.com.example:system1
/iscsi/iqn.2014-03.com.example:disk1/tpg1/acls/ create iqn.2014-03.com.example.com:system2
/> /iscsi/iqn.2014-03.com.example:disk1/tpg1/luns/ create /backstore/block/system1.disk1
/> /iscsi/iqn.2014-03.com.example:disk1/tpg1/portals/ create 192.168.122.10
/> ls
-----------------------------------------------------------
# systemctl restart target
# enable
-----------------------------------------------------------
# firewall-cmd --permanent --add-port=3260/tcp
# firewall-cmd --reload
-----------------------------------------------------------


이제 System2에서 /dev/sdb 디바이스를 통해 iSCSI Target에 액세스할 수 있게 되었습니다. 필요에 따라 해당 디바이스를 파티션, 포맷 등으로 구성할 수 있습니다.

iSCSI 개시자 주소

  • system1에 있는 iSCSI iqn.2015-02.com.example:disk1 target에 연결할 수 있도록 system2를 구성하시오.
  • 이 iSCSI 장치는 시스템이 부팅될 때 자동으로 사용됩니다.
  • 이 iSCSI 블록 장치는 ext4 파일시스템으로 format되어있는 1800MiB 파티션을 포함합니다.
  • 이 파티션은 /mnt/data로 마운트되어야 합니다.
  • 시스템 부팅 시 자동으로 이 디렉토리에 마운트되어야 합니다.
# yum install -y iscsi-initiator-utils
# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2015-02.com.example:system2

# iscsiadm -m discovery -t sendtargets -p system1.example.com
# iscsiadm -m node -T iqn.2015-02.com.example:disk1 -l
Logging in to [iface: default, target: iqn.2015-02.com.example:disk1, portal: 192.168.122.100,3260] (multiple)
Login to [iface: default, target: iqn.2015-02.com.example:disk1, portal: 192.168.122.100,3260] successful.

# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 3G 0 disk
...

# fdisk /dev/sda
n -> p -> 1 -> <enter> -> +1800M
p
Command (m for help): p
Disk /dev/sda: 3221 MB, 3221225472 bytes, 6291456 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 4194304 bytes
Disk label type: dos
Disk identifier: 0x4444207b
 Device Boot Start End Blocks Id System
/dev/sda1 8192 3694591 1843200 83 Linux
w

# mkfs -t ext4 /dev/sda1
# vim /etc/fstab
/dev/sda1 /mnt/data ext4 _netdev 0 0
# mkdir /mnt/data
# mount -a
# mount | tail -1
/dev/sda1 on /mnt/data type ext4 (rw,relatime,seclabel,stripe=1024,data=ordered,_netdev)
or (문제풀이)

# yum -y install iscsi-initiator-utils
# vi /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2014-03.com.example:system2
# systemctl restart iscsi
# enable iscsi
# iscsiadm -m discovery -t st -p 192.168.122.10
# iscsiadm -m node -T iqn.2014-03.com.example:system1 -l
# lsblk
# fdisk /dev/sda
-> 1800MB 잡아서 작업한다.
# mkfs.ext4 /dev/sda1
# mkdir /mnt/data
# vi /etc/fstab
/dev/sda1 /mnt/data ext4 _netdev 0 2
# mount -a
# df -hT

웹서버 기능을 구성

  • system1에서 사이트 http://system1.example.com을 위한 웹서버를 구성하고 다음 단계를 수행하십시오.
  • http://support.example.com/data에서 system.html 을 다운로드 받으시오.
  • 내려 받은 system.html을 index.html로 이름을 변경하시오. 파일의 내용은 절대 변경하시 마십시오.
  • example.com에 있는 모든 클라이언트들은 웹서버에 반드시 접근할 수 있어야 합니다.
  • support.example.com(192.168.122.50/32)에 있는 클라이언트들은 웹서버에 반드시 접근할 수 없어야 합니다.
웹서버 구성 후 방화벽 설정
# yum install httpd
# cd /var/www/html
# wget http://support.example.com/data/system.html
# mv system.html index.html
# systemctl start httpd; systemctl enable httpd

# firewall-cmd --permanent --add-service=http
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 service name=http source address=192.168.122.50/32 drop'

# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 forward-port port=5423 protocol=tcp to-port=80'

# firewall-cmd --reload
# firewall-cmd --list-all
public (default, active)
 interfaces: eth0 eth1 eth2 team0
 sources:
 services: dhcpv6-client http nfs rpc-bind samba smtp ssh
 ports: 20048/udp 111/tcp
 masquerade: no
 forward-ports:
 icmp-blocks:
 rich rules:
 rule family="ipv4" source address="192.168.122.50/32" service name="ssh" drop
 rule family="ipv4" source address="192.168.122.50/32" service name="http" drop
 rule family="ipv4" source address="192.168.122.0/24" forward-port port="5423" protocol="tcp" to-port="80"
or (문제풀이)
# yum -y install httpd
-------------------------------------------------------------
# cd /root
# wget http://server1.example.com/data/station.html
# cp station.html /var/www/html/index.html
-------------------------------------------------------------
# systemctl start httpd
# enable
-------------------------------------------------------------
# firewall-config
or
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 service name=http
source address=192.168.122.0/24 invert=True accept'
# firewall-cmd --reload

보안웹서버 TLS 구성

□ system1에서 웹서버 http://system1.example.com에 대해 TLS 암호화를 구성하십시오.

  • 이 웹서버를 위해서 서명된 인증서는 http://support.example.com/data/web.crt에서 찾을 수 있습니다.
  • 이 인증서와 관련된 키는 http://support.example.com/data/web.key에서 찾을 수 있습니다.
  • 이 인증서를 서명한 인증기관 인증서는 http://support.example.com/data/ca.crt에서 찾을 수 있습니다.

인증서를 서명한 인증기관 인증서와 서버의 인증서 다운로드 받기


# yum groupinstall -y 'web server'
# cd /etc/pki/tls/certs
# wget http://support.example.com/data/web.crt
# wget http://support.example.com/data/ca.crt
# chmod 600 ca.crt
# chmod 600 web.crt

인증서 키 파일 다운로드 받기
# cd /etc/pki/tls/private
# wget http://support.example.com/data/web.key
# chmod 600 web.key

# vim /etc/httpd/conf.d/ssl.conf
...
<VirtualHost *:443>
...
 SSLCertificateFile /etc/pki/tls/certs/xxx.crt
 SSLCertificateKeyFile /etc/pki/tls/private/xxx.key
 SSLCertificateChainFile /etc/pki/tls/certs/yyy.crt
...
</VirtualHost>

# systemctl restart httpd
# firewall-cmd --permanent --add-service=https
# firewall-cmd --reload

TEST
system2 ~]# curl -k https://system1.example.com

Welcome to Linux World!!!
  • (문제) system1에서 웹서버 https://system1.example.com에 대해 TLS 암호화를 구성하시오. 이 웹서버를 위해서 인증서는 http://server1.example.com/data/xxx.crt에서 찾을 수 있습니다. 이 인증서와 관련된 키는 http://server1.example.com/data/xxx.key에서 찾을 수 있습니다. 이 인증서를 서명한 인증기관 인증서는 http://server1.example.com/data/yyy.crt에서 찾을 수 있습니다.
  • SSLCertificate file : http://server1.example.com/data/xxx.crt
  • SSLCertificateKey file : http://server1.example.com/data/xxx.key
  • SSL CA Certificate file : http://server1.example.com/data/yyy.crt
oror (문제풀이)
# yum -y install mod_ssl
----------------------------------------------------------
# cd /etc/pki/tls/certs
# wget http://server1.example.com/data/yyy.crt
# http://server1.example.com/data/xxx.crt
# cd /etc/pki/tls/private
# wget http://server1.example.com/data/xxx.key
# chmod 600 xxx.key
# vi /etc/httpd/conf.d/ssl.conf
56 : <VirtualHost _default_:443>
59 : DocumentRoot "/var/www/html" <--- 주석제거
60 : ServerName system1.example.com:443 <--- 주석제거
70 : SSLEngine on
75 : SSLProtocol all –SSLv2
80 : SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
93 : SSLHonorCipherOrder on <---- 주석제거
100: SSLCertificateFile /etc/pki/tls/certs/xxx.crt <--- 파일이름변경
107: SSLCertificateKeyFile /etc/pki/tls/private/xxx.key <--- 파일이름변경
116: SSLCertificateChainFile /etc/pki/tls/certs/yyy.crt <--- 파일이름변경
or
122: SSLCACertificateFile /etc/pki/tls/certs/yyy.crt <---- 파일이름변경
(주의) 166번째 라인이 안되는 경우 122번째 라인을 사용합니다.
----------------------------------------------------------
# systemctl restart httpd
# systemctl enable httpd
----------------------------------------------------------
# firewall-cmd --permanent --add-service=https
# firewall-cmd —reload
----------------------------------------------------------
# curl -k https://system1.example.com

동적 웹 컨텐츠

  • system1에 있는 귀하의 웹서버에 다른 동적 웹 컨텐츠를 제공하도록 구성하십시오.
  • 동적 웹 컨텐츠는 alt.example.com 이름의 가상호스트에서 제공되어야 합니다.
  • alt.example.com 가상호스트는 포트 8999에서 수신 대기합니다.
  • http://support.example.com/data에서 app.wsgi를 받아서 귀하의 가상호스트에 적절히 위치시켜 동적 웹컨텐츠를 제공할 수 있게 합니다.
  • 어떤 방식이든 콘텐츠는 수정할 수 없습니다.
  • http://alt.example.com:8999로 연결하는 클라이언트는 동적으로 생성되는 웹페이지를 볼 수 있어야 합니다.
  • example.com 도메인에 있는 모든 시스템에서 http://alt.example.com:8999/ 위치에 접근 가능해야 합니다.
# yum install -y mod_wsgi

# mkdir -p /var/www/wsgi
# cd /var/www/wsgi
# wget http://support.example.com/data/app.wsgi

# cd /etc/httpd/conf.d
# vim wsgi.conf
Listen 8999
<VirtualHost *:8999>
 ServerName alt.example.com
 WSGIScriptAlias / /var/www/wsgi/app.wsgi
</VirtualHost>
<Directory /var/www/wsgi>
 require all granted
</Directory>

# semanage port -a -t http_port_t -p tcp 8999
# semanage port -l | grep http
http_port_t tcp 8999, 80, 81, 443, 488, 8008, 8009, 8443, 9000
# systemctl restart httpd.service
# firewall-cmd --permanent --add-port=8999/tcp
# firewall-cmd --reload
# curl http://alt.example.com:8999/
Time : Thu Feb 5 08:57:39 2015
  • (문제) system1에 있는 귀하의 웹서버에 다른 동적 웹컨텐츠를 제공하도록 설정하시오.
  • 동적컨텐츠는 alt.example.com 이름의 가상호스트에서 제공합니다.
  • 가상호스트는 포트 8999에서 리스닝합니다.
  • http://server1.example.com/data에 app1.wsgi를 받아서 귀하의 가상 호스트에 적절히 위치해 동적 웹 컨텐츠를 제공할 수 있게 합니다. 어떤 방식이든 컨텐츠는 수정할 수 없습니다.
  • http://alt.example.com:8999로 연결하는 클라이언트 웹페이지를 볼수 있어야 함.
  • example.com 도메인에 있는 모든 시스템에서 http://alt.example.com:8999 위치에 접근 가능해야 합니다.
or (문제풀이)
# yum -y install mod_wsgi
-----------------------------------------------
# cd /var/www/html
# wget http://server1.example.com/data/app1.wsgi
# vi /etc/httpd/conf/httpd.conf
Listen 8999
<VirtualHost *:8999>
 ServerName alt.example.com
WSGIScriptAlias / /var/www/html/app1.wsgi
</VirutalHost>
-----------------------------------------------
# semanage port --list | grep http
# semanage port -a -t http_port_t -p tcp 8999
-----------------------------------------------
# firewall-cmd --permanent --add-port=8999/tcp
# firewall-cmd --reload
-> example.com 도메인에서 alt.example.com:8999 쪽으로 허용하는 정책 필요
-----------------------------------------------
# systemctl restart httpd
# enable
-----------------------------------------------
# curl http://alt.example.com:8999
--------------------- 참고 ------------------------
app1.wsgi 테스트용 파일 내용
def application(environ, start_response):
 status = '200 OK'
output = 'Hello World!\n'
response_headers = [('Content-type', 'text/plain'),
 ('Content-Length', str(len(output)))]
 start_response(status, response_headers)
return [output]
--------------------- 참고 ------------------------

가상호스트 웹서버 구성

  • system1에 있는 귀하의 웹서버가 가상호스트 사이트 http://www1.example.com을 포함하도록 확장하시오.
  • 가상호스트의 DocumentRoot를 /var/www/virtual로 설정하시오.
  • http://support.example.com/data에서 www1.html 을 다운로드 받으시오.
  • 내려 받은 www1.html을 index.html로 이름을 변경하시오.
  • 이 파일을 가상호스트의 DocumentRoot에 두시오.
  • 사용자 sarah가 /var/www/virtual 안에서 반드시 컨텐츠를 생성할 수 있어야 합니다.
  • 주의! 원래의 웹사이트 http://system1.example.com가 계속 접근 가능해야 합니다.
  • 호스트 이름 www1.example.com에 대한 이름정보는 네임서버에서 제공하고 있습니다.
# mkdir -p /var/www/virtual
# cd /var/www/virtual
# chown sarah /var/www/virtual
# ls -ld /var/www/virtual
drwxr-xr-x. 2 sarah root 23 2월 5 09:04 /var/www/virtual

# wget http://support.example.com/data/www1.html
# mv www1.html index.html
# ls -Z
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html

# cd /etc/httpd/conf.d
# vim virtualhost.conf
<VirtualHost _default_:80>
DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *:80>
 ServerName www1.example.com
 ServerAlias www1
 DocumentRoot /var/www/virtual
 CustomLog "logs/www1.example.com.log" combined
</VirtualHost>
<Directory /var/www/virtual>
Require all granted
</Directory>

# systemctl restart httpd.service

system2# curl http://system1.example.com
Welcome to Linux World!!!

system2# curl http://www1.example.com
www1 web page
  • (문제) system1에 웹서버가 가상호스트 사이트 http://www.example.com을 포함하도록 확장하시오.
  • 가상 호스트의 Documentroot를 /var/www/virtual로 설정하시오.
  • http://server1.example.com/data에서 www1.html을 다운로드 받으시오.
  • 내려받은 www1.html을 index.html로 이름을 변경하시오. 이 파일을 가상호스트의 DocumentRoot에 두시오.
  • 사용자 opie가 /var/www/virtual 안에서 반드시 컨텐츠를 생성할 수 있어야 합니다.
  • (주의) 원래의 웹사이트 http://system1.example.com가 계속 접근 가능해야 합니다.
  • 호스트 이름 www.example.com에 대한 DNS 정보는 example.com을 위한 네임서버가 이미 제공되고 있습니다.
or (문제풀이)

# mkdir –p /var/www/virtual
# cd
# chown opie /var/www/virtual
# wget http://server1.example.com/data/www1.html
# cp www1.html index.html
# vi /etc/httpd/conf.d/virtualhost.conf
<VirtualHost _defualt_:80>
 DomcumentRooot /var/www/html
</VirtualHost>
<Directory /var/www/html>
 Require all granted
</Directory>
<VirtualHost *:80>
 ServerName www.example.com
DocumentRoot /var/www/virtual
</Directory>
<Directory /var/www/virtual>
 Require all granted
</Directory>
---------------------------------------
# restorecon –Rv /var/www/virtual
---------------------------------------
# systemctl restart httpd
---------------------------------------
# curl http://system.example.com <--- 서로 다른 페이지가 보임
# curl www.example.com <--- 서로 다른 페이지가 보임

웹 컨텐츠 접근 설정

  • system1에 있는 귀하의 웹서버의 DocumentRoot 아래 confidential이라는 이름의 디렉토리를 생성하시오
  • http://support.example.com/data에서 conf.html 을 다운로드 받으시오.
  • 내려받은 conf.html을 index.html로 이름을 변경하시오.
  • confidential은 system1에서는 누구나 볼 수 있어야 하지만, 다른 장소의 접근은 불가능해야합니다.
# mkdir /var/www/html/confidential
# cd /var/www/html/confidential
# wget http://support.example.com/data/conf.html
# mv conf.html index.html
# cd /etc/httpd/conf.d

# vim confidential.conf
 <Directory "/var/www/html/confidential">
 Options Indexes FollowSymLinks
 AllowOverride None
 Require host system1.example.com
</Directory>

# systectl restart httpd

confidential 디렉토리 구성 가상호스트웹서버구성

  • (문제) system1에 있는 귀하의 웹서버의 DocumentRoot 아래 confiential 이라는 이름의 디렉토리를 생성하시오.
  • http://server1.example.com/data에서 conf.html 파일을 다운로드 받으시오.
  • 내려 받은 conf.html 파일을 index.html 파일이름으로 변경하시오.
  • confidential 디렉토리 내용은 system1에서는 누가나 볼수 있어야 하지만, 다른 시스템에서는 이 디렉토리에 접근이 불가능해야 합니다.
or (문제풀이)

# mkdir /var/www/html/confidential
# cd
# wget http://server1.example.com/data/conf.html
# mv conf.html index.html
# vi /etc/httpd/conf.d/confidential.conf
<Directory "/var/www/html/confidential>
 Require local
</Directory>
# systemctl restart httpd
(system1) # curl http://system1.example.com/confidential/index.html <-- 내용 정상적으로 보임
(system2) # curl http://system2.example.com/confidential/index.html <-- 내용 403 Forbidden

스크립트 작성

  • 다음 내용이 동작하는 스크립트 /root/bar.sh를 system1에 작성하십시오.
  • /root/bar.sh Python 을 실행할 때 표준출력 Perl을 출력하고
  • /root/bar.sh Perl 을 실행할 때 표준출력 Python을 출력하고
  • 스크립트를 인자 없이 또는 Python 이나 Perl이 아닌 다른 인자로 실행할 때 스크립트는 표준에러를
  • 다음과 같이 출력합니다.
  • /root/bar.sh Python|Perl
# vi /root/bar.sh

#!/bin/bash
if [ $# != 1 ]; then
 echo "/root/bar.sh Python|Perl"
 exit 1
fi
if [ "$1" == "Perl" ];
 then
 echo "Python"
elif [ "$1" == "Python" ];
then
echo "Perl"
else
echo "/root/bar.sh Python|Perl"
fi

# chmod +x bar.sh
# ./bar.sh Perl
Python
# ./bar.sh Python
Perl
# ./bar.sh aa
/root/bar.sh Python|Perl
or (문제풀이)

# vi /root/bar.sh
#!/bin/bash
if [ $# -ne 1 ] ; then
echo "/root/bar.sh Python|Perl"
exit 1
fi
case $1 in
Python) echo "Perl" ;;
Perl) echo "Python" ;;
*) echo "/root/bar.sh Python|Perl"
 exit 1 ;;
esac

# chmod 755 /root/bar.sh
# /root/bar.sh
# /root/bar.sh Perl
# /root/bar.sh Python

사용자를 추가하는 스크립트 작성

  • system1에 /root/makeusers라는 이름의 스크립트를 작성하십시오.
  • 이 스크립트는 사용자 이름의 목록을 포함하는 파일이 주어졌을 때 목록에 있는 각 사용자 이름에 대한 로컬계정을 system1에 생성합니다.
  • 이 스크립트는 사용자 이름의 목록을 포함하는 파일이름을 하나의 인자(argument)로 요구해야합니다.
  • 인자가 제공되지 않으면, 이 스크립트는 Usage: /root/makeusers userfile 메세지를 표시하고 적절한 값으로 종료(exit)합니다.
  • 존재하지 않는 파일을 입력으로 지정할 경우, 이 스크립트는 Input file not found 메시지를 출력하고 적절한 값으로 종료(exit)합니다.
  • 사용자 계정들은 /bin/false로 로그인인 셸이 되도록 생성되어야 합니다.
  • 스크립트가 이 계정들에 대한 암호를 설정할 필요는 없습니다.
  • 귀하의 스크립트를 테스트할 용도로 http://support.example.com/data/userlist에 있는 사용자이름의 목록을 사용해도 됩니다.
# vi /root/makeusers

#!/bin/bash
if [ "$#" -eq "0" ]
then
 echo "Usage : /root/makeusers userfile"
 exit 1
fi
if [ -f $1 ]
then
 for user in $(cat $1)
 do
 useradd -s /bin/false $user
 done
else
 echo "Input file not found"
 exit 1
fi

# chmod +x /root/makeusers
oor (문제풀이)
# cd /root
# wget http://server.example.com/data/userlist
# cat userlist
-> 내용 확인

# vi /root/makeusers
#!/bin/bash
if [ $# -ne 1 ] ; then
echo "Usage: /root/makeusers userfile"
exit 1
fi
[ ! -f $1 ] && echo "Input file not found" && exit 2
cat userlist | while read LINE
do
useradd -s /bin/false $LINE
done

# chmod 755 /root/makeusers
# /root/makeusers
# testfile
# userlist

Mysql 데이터베이스 생성 및 암호 설정

  • system1 상에 st_db라는 이름의 mariaDB 데이터베이스를 다음 조건으로 생성하시오.
  • 데이터베이스는 http://support.example.com/data/users.mdb 에서 제공하는 데이터베이스 덤프를 반드시 사용해야 합니다.
  • 데이터베이스는 localhost에서만 접근할 수 있어야 합니다.
  • 이 데이터베이스는 root가 아닌 다른 사용자로는 mark만 질의를 허용합니다. 이 사용자의 암호는 반드시 hp12345 이어야 합니다.
  • root 사용자의 암호는 반드시 hp12345 이어야 하고, 암호를 사용하지 않고 로그인하는 것은 허용되지 않도록 합니다.
# yum groupinstall mariadb -y

localhost에서만 접근 허용
# vim /etc/my.cnf
skip-networking=1

# systemctl start mariadb.service; systemctl enable mariadb
# netstat -napt | grep mysql

root 사용자의 암호 설정
# mysql_secure_installation
Enter current password for root (enter for none): <Enter>
Set root password? [Y/n]Y
New password: hp12345
Re-enter new password: hp12345
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

# mysql -u root -p
Enter password: hp12345

계정생성
MariaDB [(none)]> use mysql;
MariaDB [mysql]> select user,host,password from user;
MariaDB [mysql]> CREATE USER mark@localhost identified by 'hp12345';
MariaDB [mysql]> GRANT SELECT on st_db.* to mark@localhost;
MariaDB [mysql]> flush privileges;
MariaDB [mysql]> exit

데이터베이스 덤프 사용
# wget http://support.example.com/data/users.mdb
# mysqladmin create st_db -u root -p
Enter password:hp12345

# mysql st_db < users.mdb -u root -p
Enter password:hp12345

# mysql -u root -p
Enter password: hp12345

MariaDB [(none)]> show databases;

MariaDB 생성

  • system1에 content라는 이름의 mariaDB 데이터베이스를 다음 조건으로 생성하시오.
  • 데이터베이스는 http://server1.example.com/data/users.mdb에서 제공하는 데이터베이스 덤프를 반드시 사용해야 한다.
  • 데이터베이스는 오직 localhost에서만 접근할 수 있어야 한다.
  • 이 데이터베이스는 root 사용자가 아닌 다른 사용자로 zekla 만 질의를 허용합니다. 이 사용자의
  • 암호는 반드시 atenorth이어야 한다.
  • root 사용자의 암호는 반드시 atenorth이어야 하고, 암호를 사용하지 않고, 로그인 하는 것은 허용되지 않도록 해야 한다.
or (문제풀이)
# yum -y install mariadb mariadb-server
------------------------------------------------
# systemctl restart mariadb
# enable mariadb
------------------------------------------------
# vi /etc/my.cnf
[mysqld]
skip-networking=1
# systemctl restart mariadb
# mysql_secure_installation
Enter current password for root (enter for none): <ENTER>
Set root password? [Y/n] Y
New password: atenorth
Re-enter new password: atenorth
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
# mysql -u root -p
MariaDB [(none)]> show databases;
MariaDB [(none)]> exit
# wget http://server1.example.com/data/users.mdb
# cat users.mdb
# mysqladmin create content -u root -p
# mysql -u root -p
> show databases;
# mysqladmin content < users.mdb -u root -p
# mysql -u root -p
> use content;
> show tables;
> select * from category;
# mysql -u root -p
> show databases;
> use mysql;
> select host,user,password from user;
> create user zekla@localhost identified by 'atenorth';
> grant select on content.* to zekla@localhost;
> flush privileges;
> exit;
-----------------------------------------------
# firewall-cmd --permanent --add-port=3260/tcp (필요하면 명령어 수행)
# firewall-cmd --reload

MariaDB 질의

  • (문제) system1에 있는 데이터베이스 content를 사용하여 적절한 SQL 질의를 생성하여 다음의 질문에 답을 하시오.
  • 암호가 ilauphin인 사람의 이름(first name)은 무엇입니까?
  • Martin 이름을 갖고 있는 사람들은 몇명이고 몇명이 cupertino 안에 있습니까?
or (문제풀이)
# mysql -u root -p
> use content;
> show tables;
> desc <table name>;
> select * from user where password = "ilauphin";
> select count(*) from user where name = "Martin";
> select * from user where name = "Martin";
  • (문제) system1에 있는 데이터베이스 content를 사용하여 적절한 SQL 질의를 생성하여 다음의 질문에 답을 하시오.
  • 암호가 ilauphin 사람의 이름은 무엇인가?
  • John 이름을 가진 사람은 몇명이며, 같은때에 shanghai 살고 있는 사람은 몇명인가?

or (문제풀이)
# mysql -u root –p
> use content; // view table structure
> show tables;
> desc <table name>; // view table filed
> select bid,password from pass where password='ilauphin'; // check password id number
> select * from name where aid='3'; // find out names through password id
> select * from name where firstname='John'; // search people in same name
> select * from loc where location='shanghai'; // search people live in the same city

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

아마존 해외 구매: 서버, 네트워크, 노트북 구매

Amazon Best Sellers Servers

Amazon Best Sellers Networking

Amazon Best Sellers Laptops

위로 스크롤