課程簡介

  • 熟悉 SDDC 軟體定義資料中心內 3 大組成元件,SDC 軟體定義運算、SDS 軟體定義儲存、SDN 軟體定義網路。
  • 熟悉 VMware vSphere SDS 軟體定義儲存概念,規劃設計 VMware vSAN(Virtual SAN) 運作環境。
  • 熟悉 Microsoft SDS 軟體定義儲存概念,規劃設計 Windows Server 2016 S2D(Storage Space Direct) 運作環境。



課程資訊

日期: 2017/7/8 ~ 2017/7/22
時間: 每週六 09:00 ~ 17:00
地點: 台中科技大學 (台中市北區三民路 91 號 2 樓)
網址: 全方位企業私有雲之 SDS 軟體定義儲存實務班




前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64) 映像檔,也就是新版 CentOS 7.3 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




Firewalld 防火牆

在過去 CentOS 5 / 6 版本中預設採用的防火牆為 IPTables,而新版 CentOS 7 版本中預設採用的防火牆則是 Firewalld。雖然 IPTables / Firewalld 這兩者都是使用 iptables tools 來與 Kernel Packet Filter 進行溝通,但是在實際運作上仍然有差異。首先,在防火牆組態設定的部分,過去 IPTables 防火牆會將組態設定儲存於「/etc/sysconfig/iptables、/etc/sysconfig/ip6tables」檔案中,而新一代 Firewalld 則是將防火牆組態設定儲存於「/usr/lib/firewalld、/etc/firewalld」XML 檔案內。

其次,在火牆規則套用生效的部分,傳統的 IPTables 防火牆運作環境中,每當調整防火牆規則時 IPTables 防火牆將會重新讀取所有防火牆規則並重新建立及套用 (套用生效的過程中,原有連線將會中斷)。新一代 Firewalld 防火牆則不會重建所有防火牆規則 (僅套用差異的防火牆規則部分),因此在套用新的防火牆規則時 Firewalld 不會中斷現有已經允許且連線中相關的防火牆規則連線。

圖、IPTables 及 Firewalld 防火牆堆疊運作架構示意圖

圖、Firewalld 防火牆運作架構示意圖



調整 Firewalld 防火牆規則

預設情況下,Firewalld 防火牆有多個不同的「區域」(Zone)並內含許多預設的防火牆規則,以便因應企業及組織不同的運作環境需求。你可以查看「/usr/lib/firewalld/zones」路徑內容,即可發現 Firewalld 防火牆預設有「Drop、Block、Public、External、DMZ、Work、Home、Internal、Tursted」等區域,詳細資訊請參考 RHEL 7 Document - Security Guide - Using FIrewalls 文件內容。
# ls -l /usr/lib/firewalld/zones/
total 36
-rw-r--r--. 1 root root 299 Nov 12  2016 block.xml
-rw-r--r--. 1 root root 293 Nov 12  2016 dmz.xml
-rw-r--r--. 1 root root 291 Nov 12  2016 drop.xml
-rw-r--r--. 1 root root 304 Nov 12  2016 external.xml
-rw-r--r--. 1 root root 369 Nov 12  2016 home.xml
-rw-r--r--. 1 root root 384 Nov 12  2016 internal.xml
-rw-r--r--. 1 root root 315 Nov 12  2016 public.xml
-rw-r--r--. 1 root root 162 Nov 12  2016 trusted.xml
-rw-r--r--. 1 root root 311 Nov 12  2016 work.xml


本文實作環境採用 CentOS 7.3 Minimal Install,並於安裝完成後預設採用「Public」這個區域的防火牆規則及組態設定,同時預設僅允許「dhcpv6-client 及 SSH」流量允許通過。你可以查看「/etc/firewalld/zones/public.xml」內容,或使用指令「firewall-cmd --list-all」確認目前採用的 Firewalld Zone 及套用的防火牆規則。
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:


倘若,管理人員需要調整 Firewalld 防火牆規則允許其它公用服務通過,例如,http、https。那麼只要在「/etc/firewalld/zones/public.xml」XML 組態設定檔內容中,加入「<service name="http"/> 及 <service name="https"/>」後,接著使用「firewall-cmd --reload」指令即可載入新的防火牆規則並套用生效。
# grep -E "http|https" /etc/firewalld/zones/public.xml
  <service name="http"/>
  <service name="https"/>
# firewall-cmd --reload
success
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: http https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:


那麼,該如何確認 Firewalld 防火牆預設支援哪些公用服務? 只要透過「firewall-cmd --get-services」指令即可列出,並使用「firewall-cmd --info-service=ssh」指令搭配公用服務名稱,即可查詢該公用服務的相關資訊。
# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client
dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability
http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls
mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy
proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap
squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server
wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
# firewall-cmd --info-service=ssh
ssh
  ports: 22/tcp
  protocols:
  source-ports:
  modules:
  destination:


此外,當管理人員需要調整 Firewalld 防火牆允許其它連接埠,例如,TCP Port 8080。那麼,只要修改「/etc/firewalld/zones/public.xml」內容,加上「<port protocol="tcp" port="8080"/>」後,接著使用「firewall-cmd --reload」指令即可載入新的防火牆規則並套用生效。
# grep 8080 /etc/firewalld/zones/public.xml
  <port protocol="tcp" port="8080"/>
# firewall-cmd --reload
success
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: http https ssh
  ports: 8080/tcp
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64) 映像檔,也就是新版 CentOS 7.3 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




Systemd 是什麼?

簡單來說,從 CentOS 7 版本開始在管理系統的部分,已經從過往傳統的 Runlevel (/etc/rc.d/init.d) 改為新一代的 systemd  (/etc/systemd/system)。因此,倘若查看舊有 Runlevel 組態設定檔 (/etc/inittab) 內容會發現是空的 (詳細資訊請參考 RHEL 7 System Administrator Guide - Chapter 9. Managing Services with systemd)。

圖、systemd 系統運作架構示意圖
圖片來源: systemd - Wikipedia



CentOS 7 開機程序

談到 CentOS 的 Systemd 啟動模式等級,便要先了解一下整個 CentOS 開機過程。透過下列的開機流程說明,便會了解到在 Systemd 啟動模式,為何能夠掌控系統後半段開機階段的相關服務啟動及關閉。下列開機流程是以安裝於 x86 硬體上的 CentOS 系統進行說明 (詳細資訊請參考 Overview of systemd for RHEL 7 - Red Hat Customer Portal):

  • 從 BIOS 所選的媒體裝置 (例如,本機硬碟) 載入 Boot Loader (RHEL 7 / CentOS 7 採用 GRUB2)。
  • 啟動 Kernel Initial RAM Disk
  • Systemd 執行程序初始化系統並啟動所有系統服務 (讀取 default.target 內容)。
  • Multi-User Mode (/lib/systemd/system/multi-user.target) 裡面有一行 Requires=basic.target 內容,表示系統將會載入  Basic.traget  (載入 RHEL7 System)。
  • Basic.traget (/usr/lib/systemd/system/basic.target) 裡面有一行 Requires=sysinit.target 內容,表示系統將會載入  Sysinit.traget (載入 System Initialization Services)。
  • Sysinit.target (/usr/lib/systemd/system/sysinit.target) 裡面有一行 Wants=local-fs.target swap.target 內容,表示將會載入 local-fs.target swap.target (執行 Mounting File Systems 及 Enabling Swap Devices)。此外,還會處理 enable logging、set kernel options、start the udevd daemon to detect hardware、allow file system decryption、iSCSI、multipath、LVM monitoring、RAID services。
  • local-fs.target (/usr/lib/systemd/system/local-fs.target) 裡面有一行 After=local-fs-pre.target 內容,表示等 local-fs-pre.target 完成後才載入。




Systemd 啟動模式等級

本文實作環境採用 CentOS 7.3 Minimal Install,預設情況下便會採用「Multi-User Mode」(類似舊有的 Runlevel 3 運作環境)。你可以透過查看「/etc/systemd/system/default.target」內容,或者執行「systemctl get-default」指令即可查詢,目前 CentOS 主機的啟動模式等級。
# ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 May 19 16:28 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target
# systemctl get-default
multi-user.target




接著,我們可以透過查看「/etc/systemd/system/multi-user.target.wants」內容,或「systemctl list-units --type service |grep running」指令了解 Multi-User Mode 的運作模式預設會啟用哪些系統服務。
# ls -l /etc/systemd/system/multi-user.target.wants
total 0
lrwxrwxrwx. 1 root root 38 May 19 16:25 auditd.service -> /usr/lib/systemd/system/auditd.service
lrwxrwxrwx. 1 root root 37 May 19 16:24 crond.service -> /usr/lib/systemd/system/crond.service
lrwxrwxrwx. 1 root root 47 May 19 17:22 hv_fcopy_daemon.service -> /usr/lib/systemd/system/hv_fcopy_daemon.service
lrwxrwxrwx. 1 root root 45 May 19 17:22 hv_kvp_daemon.service -> /usr/lib/systemd/system/hv_kvp_daemon.service
lrwxrwxrwx. 1 root root 45 May 19 17:22 hv_vss_daemon.service -> /usr/lib/systemd/system/hv_vss_daemon.service
lrwxrwxrwx. 1 root root 42 May 19 16:25 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service
lrwxrwxrwx. 1 root root 37 May 19 16:25 kdump.service -> /usr/lib/systemd/system/kdump.service
lrwxrwxrwx. 1 root root 39 May 19 16:25 postfix.service -> /usr/lib/systemd/system/postfix.service
lrwxrwxrwx. 1 root root 40 May 19 16:24 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target
lrwxrwxrwx. 1 root root 39 May 19 16:25 rsyslog.service -> /usr/lib/systemd/system/rsyslog.service
lrwxrwxrwx. 1 root root 36 May 19 16:25 sshd.service -> /usr/lib/systemd/system/sshd.service
lrwxrwxrwx. 1 root root 37 May 19 16:25 tuned.service -> /usr/lib/systemd/system/tuned.service
# systemctl list-units --type service |grep running
auditd.service                     loaded active running Security Auditing Service
crond.service                      loaded active running Command Scheduler
dbus.service                       loaded active running D-Bus System Message Bus
firewalld.service                  loaded active running firewalld - dynamic firewall daemon
getty@tty1.service                 loaded active running Getty on tty1
hv_fcopy_daemon.service            loaded active running Hyper-V FCOPY daemon
hv_kvp_daemon.service              loaded active running Hyper-V KVP daemon
hv_vss_daemon.service              loaded active running Hyper-V VSS daemon
polkit.service                     loaded active running Authorization Manager
postfix.service                    loaded active running Postfix Mail Transport Agent
rsyslog.service                    loaded active running System Logging Service
sshd.service                       loaded active running OpenSSH server daemon
systemd-journald.service           loaded active running Journal Service
systemd-logind.service             loaded active running Login Service
systemd-udevd.service              loaded active running udev Kernel Device Manager
tuned.service                      loaded active running Dynamic System Tuning Daemon


倘若,希望了解支援哪些運作層級類型,請執行「systemctl list-units --type=target」指令即可查詢。
# systemctl list-units --type=target
UNIT                  LOAD   ACTIVE SUB    DESCRIPTION
basic.target          loaded active active Basic System
cryptsetup.target     loaded active active Encrypted Volumes
getty.target          loaded active active Login Prompts
local-fs-pre.target   loaded active active Local File Systems (Pre)
local-fs.target       loaded active active Local File Systems
multi-user.target     loaded active active Multi-User System
network-online.target loaded active active Network is Online
paths.target          loaded active active Paths
remote-fs.target      loaded active active Remote File Systems
slices.target         loaded active active Slices
sockets.target        loaded active active Sockets
swap.target           loaded active active Swap
sysinit.target        loaded active active System Initialization
timers.target         loaded active active Timers

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

14 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.




Systemctl 系統服務管理常用參數

在傳統的 Runlevel 運作環境中,我們常常會使用「service / chkconfig」指令來管理系統服務。現在,新一代的 Systemd 運作環境中一律使用「systemctl」指令來管理系統服務即可。下列為搭配 systemctl 指令管理系統服務的常用參數:

  • status: 查詢指定的系統服務運作狀態,例如,systemctl status sshd。
  • stop: 停止指定的系統服務,例如,systemctl stop sshd。
  • start: 啟動指定的系統服務,例如,systemctl start sshd。
  • enable: 設定指定的系統服務開機時自動啟動,例如,systemctl enable sshd。
  • disable: 設定指定的系統服務開機時自動啟動,例如,systemctl disable sshd。
  • list-dependencies: 查詢指定的系統服務相依性資訊,例如,systemctl list-dependencies sshd。
  • list-units: 查詢系統服務類型資訊,例如,systemctl list-units --type service 或 systemctl list-units --type mount。
  • list-unit-files: 列出所有系統服務運作狀態,例如,systemctl list-unit-files。

# systemctl status sshd
sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2017-05-25 14:35:21 CST; 1h 14min ago
     Docs: man:sshd(8)
           man:sshd_config(5)
  Process: 18018 ExecStart=/usr/sbin/sshd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 18020 (sshd)
   CGroup: /system.slice/sshd.service
           └─18020 /usr/sbin/sshd

May 25 14:35:21 centos73.weithenn.org systemd[1]: Starting OpenSSH server daemon...
May 25 14:35:21 centos73.weithenn.org systemd[1]: PID file /var/run/sshd.pid not readable (yet?) after start.
May 25 14:35:21 centos73.weithenn.org sshd[18020]: Server listening on 0.0.0.0 port 22.
May 25 14:35:21 centos73.weithenn.org systemd[1]: Started OpenSSH server daemon.
May 25 14:37:54 centos73.weithenn.org sshd[18150]: Accepted password for weithenn from 192.168.16.184 port 60836 ssh2

前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64) 映像檔,也就是新版 CentOS 7.3 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




擴充 YUM 套件管理工具 RPM 數量

雖然在上一篇文章中,我們已經將 YUM 套件管理工具的鏡像站台,設定為台灣鏡像站台來加快套件下載速度。然而,儘管官方的 YUM 套件管理工具中套件數量已經不少,但目前官方套件數量中僅包含必要套件,例如,常常用來管理 MySQL 資料庫的 PhpMyAdmin 套件,就未包含在內建的 YUM 軟體套件庫 (RPM Repository) 當中。

雖然我們可以自行下載 PhpMyAdmin 套件並手動安裝到系統上,但個人的主機管理習慣,是盡量使用 YUM 套件管理工具來處理 RPM 套件的安裝、移除、升級…等作業。因此,我們可以透過第 3 方且獲社群認可的軟體套件庫,在安裝後擴充 YUM 套件管理工具中的套件數量。首先,我們可以執行「yum repolist」指令,查詢目前 CentOS 主機軟體套件庫中所支援的套件數量,從查詢結果中可以看到目前套件總數為「11,346」
# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tc.edu.tw
 * extras: ftp.tc.edu.tw
 * updates: ftp.tc.edu.tw
repo id                                 repo name                                 status
base/7/x86_64                           CentOS-7 - Base                           9,363
extras/7/x86_64                         CentOS-7 - Extras                           337
updates/7/x86_64                        CentOS-7 - Updates                        1,646
repolist: 11,346

圖、目前 YUM 管理工具套件總數量

在本文中,我們將會安裝「EPEL (Extra Packages for Enterprise Linux)」「ELRepo (The Community Enterprise Linux Repository)」,獲社群認可的第 3 方軟體套件庫。在下列操作中,可以看到當系統尚未安裝 EPEL 軟體套件庫以前,透過 YUM 管理工具套件庫 (RPM Repository) 是搜尋不到 PhpMyAdmin 套件的。
# yum search phpmyadmin
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tc.edu.tw
 * extras: ftp.tc.edu.tw
 * updates: ftp.tc.edu.tw
Warning: No matches found for: phpmyadmin
No matches found

圖、無法搜尋到 phpmyadmin 套件



安裝 EPEL 第 3 方軟體套件庫

請執行「yum -y install epel-release」指令安裝 EPEL 第 3 方軟體套件庫。
# yum -y install epel-release
Loaded plugins: fastestmirror
base                                                                                                       | 3.6 kB  00:00:00
extras                                                                                                     | 3.4 kB  00:00:00
updates                                                                                                    | 3.4 kB  00:00:00
Loading mirror speeds from cached hostfile
 * base: ftp.tc.edu.tw
 * extras: ftp.tc.edu.tw
 * updates: ftp.tc.edu.tw
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-9 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==================================================================================================================================
 Package                             Arch                          Version                    Repository                     Size
==================================================================================================================================
Installing:
 epel-release                        noarch                        7-9                        extras                         14 k

Transaction Summary
==================================================================================================================================
Install  1 Package
Total download size: 14 k
Installed size: 24 k
Downloading packages:
epel-release-7-9.noarch.rpm                                                                                |  14 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : epel-release-7-9.noarch                                                                                        1/1
  Verifying  : epel-release-7-9.noarch                                                                                        1/1
Installed:
  epel-release.noarch 0:7-9
Complete!


圖、安裝 EPEL 軟件庫

順利安裝 EPEL 軟體套件庫後,便可以順利找到 phpmyadmin 套件,當然後續也可以透過 yum 指令進行下載及安裝等套件管理作業。
# yum search phpmyadmin
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tc.edu.tw
 * epel: mirrors.ustc.edu.cn
 * extras: ftp.tc.edu.tw
 * updates: ftp.tc.edu.tw
================================ N/S matched: phpmyadmin ================================
php-phpmyadmin-motranslator.noarch : Translation API for PHP using Gettext MO files
php-phpmyadmin-shapefile.noarch : ESRI ShapeFile library for PHP
phpMyAdmin.noarch : Handle the administration of MySQL over the World Wide Web

  Name and summary matches only, use "search all" for everything.

圖、順利找到 phpmyadmin 套件

此時,可以執行「yum repolist」指令,從查詢結果中可以看到原本套件總數只有11,346,在安裝 EPEL 軟體套件庫後增加了「11,670」個套件,所以套件總數提升為「23,016」
# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tc.edu.tw
 * epel: ftp.riken.jp
 * extras: ftp.tc.edu.tw
 * updates: ftp.tc.edu.tw
repo id                        repo name                                                     status
base/7/x86_64                  CentOS-7 - Base                                                9,363
*epel/x86_64                   Extra Packages for Enterprise Linux 7 - x86_64                11,670
extras/7/x86_64                CentOS-7 - Extras                                                337
updates/7/x86_64               CentOS-7 - Updates                                             1,646
repolist: 23,016

圖、EPEL 軟件庫增加 11,670 個套件



安裝 ELRepo 第 3 方軟體套件庫

接著,我們執行相關指令來安裝 ELRepo 軟件庫。然後,再次執行「yum repolist」指令,查詢目前 CentOS 主機軟件庫中所支援的套件數量,從查詢結果中可以看到安裝 ELRepo 軟體套件庫後增加了「184」個套件,所以套件總數提升為「23,207」
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
Retrieving http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:elrepo-release-7.0-2.el7.elrepo  ################################# [100%]
[root@centos73 weithenn]# yum repolist
Loaded plugins: fastestmirror
base                                                                               | 3.6 kB  00:00:00
elrepo                                                                             | 2.9 kB  00:00:00
epel/x86_64/metalink                                                               | 5.4 kB  00:00:00
epel                                                                               | 4.3 kB  00:00:00
extras                                                                             | 3.4 kB  00:00:00
updates                                                                            | 3.4 kB  00:00:00
(1/4): extras/7/x86_64/primary_db                                                  | 151 kB  00:00:00
(2/4): epel/x86_64/updateinfo                                                      | 799 kB  00:00:00
(3/4): elrepo/primary_db                                                           | 413 kB  00:00:03
(4/4): epel/x86_64/primary_db                                                      | 4.7 MB  00:00:06
Loading mirror speeds from cached hostfile
 * base: ftp.tc.edu.tw
 * elrepo: ftp.yz.yamagata-u.ac.jp
 * epel: ftp.riken.jp
 * extras: ftp.tc.edu.tw
 * updates: ftp.tc.edu.tw
repo id                        repo name                                                            status
base/7/x86_64                  CentOS-7 - Base                                                       9,363
elrepo                         ELRepo.org Community Enterprise Linux Repository - el7                  184
epel/x86_64                    Extra Packages for Enterprise Linux 7 - x86_64                       11,674
extras/7/x86_64                CentOS-7 - Extras                                                       340
updates/7/x86_64               CentOS-7 - Updates                                                    1,646
repolist: 23,207

圖、ELRepo 軟體庫增加 184 個套件

前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64) 映像檔,也就是新版 CentOS 7.3 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




YUM 套件管理工具

絕大部份的開放原始碼軟體皆採用 Tarball 的形式進行發布,而在 Linux 上為了解決使用 Tarball 必須要解壓縮、檢測 (./configure)、編譯 (make)、安裝 (make install) 等繁鎖步驟,因此發展出 RPM (The RPM Package Manager) 來簡化整個安裝流程。雖然 RPM 安裝機制簡化了整個安裝流程但卻無法解決套件相依性及套件相衝突的問題,舉例來說您可能安裝 A RPM 時系統顯示您必須要先安裝 B RPM(套件相依性),而當您下載及安裝 B RPM 時又說需要安裝 C RPM(套件相依性),當您好不容易又下載及安裝 C RPM 時卻出現此 RPM 跟 A RPM 互相衝突,碰到這種情況時在以往您只能手動排除這種套件衝突的狀況了。

YUM (Yellow dog Updater Modified) 套件管理工具便是解決上述 RPM 套件相依性及相衝突的問題而發展出來的套件管理解決方案。此套件管理工具能從指定的套件伺服器上自動下載相對應的 RPM 套件包至系統進行安裝,並且當出現套件相依性時能自動下載及安裝相關聯的 RPM 套件,同時會盡量避免發生套件衝突的情況。YUM 能夠有效簡化軟體套件安裝流程並解決惱人的套件相依性及相衝突的問題,使得軟體套件在安裝、移除、升級程序上變得非常容易。

預設 YUM 下載套件的來源伺服器為國外網站,我們可以透過修改 YUM 設定檔 「/etc/yum.repos.d/CentOS-Base.repo」 將下載套件的鏡像網站指定至台灣境內各所大學或機構。目前台灣可以使用的鏡像網站約有 11 個(如下所示),請您依個人網路狀況選擇較適合您的網路環境進行設定以便加快套件下載速度,或者參考 CentOS 鏡像網站清單選擇位於您國家內的鏡像網站:

  • 樹德科技大學: http://ftp.stu.edu.tw/Linux/CentOS/
  • 元智大學: http://ftp.yzu.edu.tw/Linux/CentOS/
  • 義守大學: http://ftp.isu.edu.tw/pub/Linux/CentOS/
  • 崑山科大: http://ftp.ksu.edu.tw/pub/CentOS/
  • 國家高速網路與計算中心: http://ftp.twaren.net/Linux/CentOS/
  • 南臺科大: http://ftp.stust.edu.tw/pub/Linux/CentOS/
  • 臺中市政府教育局: http://ftp.tc.edu.tw/Linux/CentOS/
  • 靜宜大學: http://ftp.cs.pu.edu.tw/Linux/CentOS/
  • 中山大學: http://ftp.nsysu.edu.tw/CentOS/
  • Hinet IDC: http://mirror01.idc.hinet.net/CentOS/
  • 交通大學: http://centos.cs.nctu.edu.tw/


下列操作步驟中,我們將 YUM 設定檔內鏡像網站由預設國外站台修改為國內的 Hinet IDC
# cd /etc/yum.repos.d/
# cp CentOS-Base.repo CentOS-Base.repo.bak
# sed -i 's,mirror.centos.org/centos,mirror01.idc.hinet.net/CentOS,g' CentOS-Base.repo


上述設定完成後您便可以開始使用 YUM 配合相關指令管理套件,但是在開始以前建議確認 CentOS 主機時間是否正確,以免後續管理相關套件時,因為本機系統時間與 YUM 鏡像網站時間差異過大造成不可預期的錯誤。下列條列出使用 YUM 套件管理工具時,常常會使用到的指令及相關參數意義:

  • yum check-update: 套件更新檢查,將目前系統上安裝的套件與 YUM 鏡像網站進行檢查比對後列出需要更新套件的清單。
  • yum update: 套件更新,檢查及比對系統需要套件更新的清單後詢問您是否要更新套件,您可以配合參數 –y 對所有詢問一律回答 yes 來允許所有套件更新。
  • yum install <套件名稱>: 安裝套件,執行從 YUM 鏡像網站下載指定套件並進行安裝,收集相關資訊後會詢問您是否確定要安裝,您可以配合參數 –y 對所有詢問一律回答 yes 來安裝指定套件及其相依性套件。
  • yum remove <套件名稱>: 移除套件,移除您指定的套件名稱,收集相關資訊後會詢問您是否確定要移除該套件,您可以配合參數 –y 對所有詢問一律回答 yes 來移除指定的套件及相依性套件。
  • yum clean all: 清除暫存資料,清除使用 YUM 套件管理工具下載 RPM 進行安裝時的暫存檔案。
  • yum search <套件名稱或關鍵字>: 搜尋套件,您可使用已經知道的套件名稱或者有關於套件的關鍵字來進行搜尋的動作。
  • yum list: 顯示可安裝套件清單,顯示您指定的 YUM 鏡像網站中所支援安裝的所有套件名稱。
  • yum info <套件名稱>: 套件資訊,顯示您指定的套件其詳細資訊,例如適用平台、套件版本、套件大小、套件功能描述、套件授權資訊、套件官方網址等資訊。
  • yum grouplist: 顯示可安裝的套件群組清單,顯示您指定的 YUM 鏡像網站中所支援安裝的所有套件群組名稱。
  • yum groupinstall <套件群組名稱>: 安裝套件群組,執行從 YUM 鏡像網站下載指定套件群組中相關套件並進行安裝,收集套件群組相關資訊後會詢問您是否確定要安裝,您可以配合參數 –y對所有詢問一律回答 yes 來安裝指定套件及其相依性套件。
  • yum groupremove <套件群組名稱>: 移除套件群組,移除您指定的套件群組,並且在系統收集相關資訊後,會詢問是否確定要移除該套件群組中所有套件,您可以配合參數 –y 對所有詢問一律回答 yes 來移除指定的套件群組。
  • yum groupinfo <套件群組名稱>: 查詢套件群組資訊,查詢指定的套件群組資訊及功能描述,並且將顯示此套件群組中預設會安裝的套件清單 (Default Packages)、強制安裝的套件清單 (Mandatory Packages)、選擇安裝的套件清單 (Optional Packages)。
  • yum provides <指令名稱>: 查詢指令的來源套件,查詢系統中某個指令是由哪個套件所提供。

舉例來說,在 CentOS 7 版本中預設情況下並不會有 ifconfig 及 netstat 指令,此時便可以使用「yum provides ifconfig netstat」指令來查詢,這 2 個指令可以透過安裝「net-tools」套件獲得。
# yum provides ifconfig netstat
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tc.edu.tw
 * elrepo: ftp.yz.yamagata-u.ac.jp
 * epel: mirror.premi.st
 * extras: ftp.tc.edu.tw
 * updates: ftp.tc.edu.tw
net-tools-2.0-0.17.20131004git.el7.x86_64 : Basic networking tools
Repo        : base
Matched from:
Filename    : /sbin/ifconfig

net-tools-2.0-0.17.20131004git.el7.x86_64 : Basic networking tools
Repo        : base
Matched from:
Filename    : /bin/netstat



由於 YUM 套件管理工具實際上也是幫助我們對 RPM 套件包進行管理的工作,其實底層的安裝、移除、升級等動作仍是使用 RPM 套件,因此我們仍可以使用 rpm 指令來幫助我們了解及管理套件,例如,使用 rpm 指令來了解已安裝的 Firewalld 套件、設定檔及服務啟動檔在哪裡。
# rpm -qa firewalld   //查詢套件版本
firewalld-0.4.3.2-8.el7.noarch
# rpm -qc firewalld   //列出套件設定檔
/etc/dbus-1/system.d/FirewallD.conf
/etc/firewalld/firewalld.conf
/etc/firewalld/lockdown-whitelist.xml
/etc/sysconfig/firewalld
# rpm -ql firewalld   //列出套件所有檔案
/etc/dbus-1/system.d/FirewallD.conf
/etc/firewalld
/etc/firewalld/firewalld.conf
/etc/firewalld/icmptypes
/etc/firewalld/lockdown-whitelist.xml
/etc/firewalld/services
/etc/firewalld/zones
/etc/sysconfig/firewalld
/usr/bin/firewall-cmd
...略...

圖、使用 rpm 指令查詢套件資訊

前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64) 映像檔,也就是新版 CentOS 7.3 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




禁止 root 管理帳號 SSH 遠端登入

在預設的情況下,您可以直接使用 root 管理帳號來遠端登入 Linux 作業系統進行管理,然而在管理作業系統上通常安全性便利性是相對的二個拉扯點。所以,當您所管理的作業系統其操作便利性愈則安全性通常會相對的降,在此建議您關閉 Linux 預設允許 root 管理者帳號可以遠端登入管理系統,原因如下:

  • 主機將會增加了被入侵的機會。因為,在管理者帳號已知的情況下,剩下就是嘗試登入密碼了,如此一來很容易遭受暴力猜測密碼攻擊。
  • 當一台主機有眾多管理者時大家皆使用 root 管理者帳號登入系統進行管理動作,則誰修改了某個檔案內容或執行了哪些動作均無法稽核,因為記錄的資料都是 root。
  • 直接使用 root 管理者帳號登入系統進行管理,若是在操作過程中不慎下錯指令時有極大的可能會把系統給毀掉。例如原本是想刪除根目錄下的 test 資料夾 rm –rf /test 若不慎在操作時不小心多個空格 rm –rf / test,則對於作業系統來說是要刪除根目錄 (/) 及目前所在的 test 資料夾。


要將 CentOS 主機預設允許 root 管理者帳號遠端登入的功能關閉 (PermitRootLogin yes -> no),可以透過修改「/etc/ssh/sshd_config」 設定檔後再重新載入 SSH 服務即可套用變更,套用完成後您可以測試是否無法使用 root 管理帳號遠端登入主機以便確定修改是否生效。

此外,有時可能會遇到一種情況,便是遠端登入主機時輸入帳號後怎麼要等很久才能輸入密碼? 會有這樣的狀況發生是因為 CentOS 在啟動 SSH 服務時,預設會配合使用名稱解析所導致,所以您主機運作的網路環境中名稱解析服務已經運作正常則不會有此問題發生。倘若,發生這樣的問題時,請檢查 DNS 名稱解析中反向解析對於此主機的解析情況,若此台主機所在的網路環境中並沒有反向名稱解析的機制,您可取消 SSH 服務中預設會使用到名稱解析的動作即可解決此一問題 (UseDNS yes -> no)

最後,預設情況下 SSH 的 Listen Port 為 22,為了安全性考量也可以把預設 SSH Listen Port 改掉,例如,改為 Listen Port 22168
# vi /etc/ssh/sshd_config
#PermitRootLogin yes   //預設值,禁止 Root 帳號遠端登入
PermitRootLogin no     //修改後
#UseDNS yes            //預設值,啟用 DNS 名稱解析
UseDNS no              //修改後
#Port 22               //預設值,SSH Listen Port
Port 22168             //修改後
# grep -E '(PermitRootLogin|UseDNS|Port)' /etc/ssh/sshd_config  //確認修改結果
Port 22168
PermitRootLogin no
UseDNS no
# systemctl restart sshd   //重新啟動 SSH 服務
# systemctl status sshd    //查看 SSH 服務運作狀態
sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2017-05-24 10:26:05 CST; 4s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
  Process: 5704 ExecStart=/usr/sbin/sshd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 5705 (sshd)
   CGroup: /system.slice/sshd.service
           └─5705 /usr/sbin/sshd
May 24 10:26:05 centos73.weithenn.org systemd[1]: Starting OpenSSH server daemon...
May 24 10:26:05 centos73.weithenn.org systemd[1]: PID file /var/run/sshd.pid not readable (yet?) after start.
May 24 10:26:05 centos73.weithenn.org sshd[5705]: Server listening on 0.0.0.0 port 22168.
May 24 10:26:05 centos73.weithenn.org systemd[1]: Started OpenSSH server daemon.

圖、修改 SSH 組態並重新載入服務

重新載入 SSH 服務後,可以使用「netstat -tunpl」指令確認 sshd 服務是否把 Listen Port 改為 22168
# netstat -tunpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q  Local Address   Foreign Address   State    PID/Program name
tcp        0      0  0.0.0.0:22168   0.0.0.0:*         LISTEN   5705/sshd
tcp        0      0  127.0.0.1:25    0.0.0.0:*         LISTEN   664/master

圖、確認 SSH 服務 Listen Port 是否變更

此時,倘若有人嘗試以 Root 管理者帳號並透過 SSH 遠端連線的方式時,將會發現即使 Root 帳號密碼鍵入正確,也會得到 Access Denied 的錯誤訊息且無法登入。同時,在系統中的「/var/log/audit/audit.log」也會記錄這個異常行為。
# tail -n3 /var/log/audit/audit.log
type=USER_AUTH msg=audit(1495597953.015:673): pid=5929 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=password acct="root" exe="/usr/sbin/sshd" hostname=? addr=192.168.16.184 terminal=ssh res=failed'
type=USER_AUTH msg=audit(1495597959.710:674): pid=5929 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:authentication grantors=? acct="root" exe="/usr/sbin/sshd" hostname=192.168.16.184 addr=192.168.16.184 terminal=ssh res=failed'
type=USER_AUTH msg=audit(1495597961.812:675): pid=5929 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=password acct="root" exe="/usr/sbin/sshd" hostname=? addr=192.168.16.184 terminal=ssh res=failed'


此外,要記得修改 Firewalld 防火牆規則,把允許 SSH Port 22 通行的規則改為 Port 22168。有關 Firewalld 防火牆規則的操作,請參考 CentOS 7.3 基礎設定 (10) - 調整 Firewalld 防火牆規則 文章。
# cat /etc/firewalld/zones/public.xml   //查詢目前防火牆規則
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <port protocol="tcp" port="22168"/>
</zone>
# firewall-cmd --reload   //重新載入防火牆規則
success
# firewall-cmd --list-all //顯示載入的防火牆規則
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services:
  ports: 22168/tcp
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

圖、調整 Firewalld 防火牆規則



禁止 root 管理帳號本機登入

經過上述組態設定後,我們已經禁止讓 Root 管理帳號使用 SSH 遠端登入 CentOS 主機。然而,個人的管理習慣是希望大家都透過 sudo 轉換成管理權限,而非有人使用 root 管理帳號直接進行維運,所以也將 Root 管理帳號「停用本機登入」的機制 (詳細資訊請參考 RHEL 7 Documentation - Security Guide - Controlling Root Access)。

倘若,希望了解 Root 管理帳號的登入情況,請執行「utmpdump /var/log/wtmp | grep root」指令即可 (tty 表示由 Console 本機登入,pts 表示由 SSH 遠端登入)
# utmpdump /var/log/wtmp | grep root
Utmp dump of /var/log/wtmp
[7] [00522] [tty1] [root  ] [tty1   ] [                ] [0.0.0.0        ] [Fri May 19 16:29:44 2017 CST]
[7] [00521] [tty1] [root  ] [tty1   ] [                ] [0.0.0.0        ] [Fri May 19 17:24:21 2017 CST]
[7] [00511] [tty1] [root  ] [tty1   ] [                ] [0.0.0.0        ] [Mon May 22 10:17:12 2017 CST]
[7] [00512] [tty1] [root  ] [tty1   ] [                ] [0.0.0.0        ] [Mon May 22 10:22:51 2017 CST]
[7] [02541] [ts/0] [root  ] [pts/0  ] [192.168.16.184  ] [192.168.16.184 ] [Mon May 22 11:30:28 2017 CST]
[7] [02645] [ts/0] [root  ] [pts/0  ] [192.168.16.184  ] [192.168.16.184 ] [Mon May 22 14:15:44 2017 CST]
[7] [02077] [ts/0] [root  ] [pts/0  ] [192.168.16.184  ] [192.168.16.184 ] [Mon May 22 14:52:47 2017 CST]
[7] [02118] [ts/0] [root  ] [pts/0  ] [192.168.16.184  ] [192.168.16.184 ] [Mon May 22 15:19:51 2017 CST]
[7] [00537] [tty1] [root  ] [tty1   ] [                ] [0.0.0.0        ] [Wed May 24 09:20:29 2017 CST]

圖、查詢 Root 管理帳號登入記錄

如下列操作,執行「vipw」指令將 root 管理帳號從原本的「/bin/bash」修改為「/sbin/nologin」後存檔離開即可。待修改完畢後,便會發現 Root 管理帳號也無法本機登入。
# vipw
root:x:0:0:root:/root:/bin/bash      //預設值
root:x:0:0:root:/root:/sbin/nologin  //修改後




鎖定 root 管理帳號登入密碼

倘若,不希望停用 Root 管理帳號本機登入機制,也可以採用將 Root 管理密碼「鎖定」(Locking)的方式。請執行「passwd -l root」指令便可以鎖定 Root 管理帳號的登入密碼 (使用參數 -u 即可解除鎖定)。
# passwd -S root   //查詢狀態,登入密碼尚未鎖定
root PS 1969-12-31 0 99999 7 -1 (Password set, SHA512 crypt.)
# passwd -l root   //鎖定 Root 帳號登入密碼
Locking password for user root.
passwd: Success
# passwd -S root   //查詢狀態,登入密碼已鎖定
root LK 1969-12-31 0 99999 7 -1 (Password locked.)

圖、鎖定 Root 管理帳號登入密碼

前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64) 映像檔,也就是新版 CentOS 7.3 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




設定 sudo 管理員帳號管理機制

CentOS 作業系統當中 root 使用者帳號被稱為超級使用者帳號,此帳號為整個作業系統中權限最大的管理帳號,權限大到可以直接將作業系統自我毀滅。由於 root 超級使用者帳號權限如此之大,因此強烈建議您應該使用一般使用者帳號登入主機進行操作,待需要執行的動作需要提升權限時才切換為管理帳號進行操作,以免因為一時疏忽或者不慎手誤,造成系統或服務損壞,例如,GitLab 史上最大危機:工程師誤刪大量資料,導致線上服務崩潰 | TechNews 科技新報。💣

當您所管理的 CentOS 主機同時擁有多個管理者進行管理時,您該如何確定是其中哪個管理者使用了 root 管理帳號對系統做了什麼事情? 例如,當您想要得知是哪個管理者在哪個時間切換為 root 管理帳號並且對系統執行了哪些指令,傳統的切換方式 su – 就不符合這樣的需求了,有鑑於此我們可以透過設定 sudo 來達成這樣的查核需求。

Sudo 套件就是為了彌補作業系統中內建的身份切換指令 su 不足所發展出來的軟體套件,透過設定此套件後我們可以建立相關的使用者權限群組,並且給予不同權限的指令來達到控管使用者權限的目的,同時配合相關參數設定我們可以隨時查閱哪位使用者執行過 sudo 指令來提升權限,並且能查出該使用者對於系統在權限提升之後執行了哪些動作,以便進行事後的追查。

首先,請先使用 rpm 及 which 指令來查詢系統中是否已經安裝 sudo 套件(預設情況下會安裝此套件)以及相關指令是否存在,確認目前系統中有安裝此套件時請接著使用 visudo 指令來修改 sudo 設定檔內容。建議您不要直接使用 VI 或 VIM 編輯器來修改 sudo 設定檔,原因除了 visudo 指令會自行尋找 sudo 設定檔 (/etc/sudoers) 並且進入編輯模式之外,當我們修改完成後若設定檔內容中有發生語法或斷行等錯誤時,系統會在顯示警告訊息提醒我們哪裡發生語法錯誤。
# rpm -qa sudo
sudo-1.8.6p7-20.el7.x86_64
# which sudo visudo
/usr/bin/sudo
/usr/sbin/visudo


在此次實作中我們會修改 sudo 設定檔內容為將 wheel 群組那行的註解符號拿掉,並且加上 Log 記錄檔的內容「/var/log/sudo.log」,當此 sudo 設定檔設定完畢後,後續只要有人執行 sudo 指令提升權限至管理者身份時便會觸發到剛才設定檔中的 Log 設定,此時系統會自動產生 Log 檔案並將相關資訊寫入其中。相關操作如下所示:
# visudo
%wheel  ALL=(ALL)       ALL                
Defaults log_host, logfile=/var/log/sudo.log  //加上此行


上述 sudo 設定檔內容表示只要屬於 wheel 群組內的使用者帳號,便可以使用 sudo 指令來暫時提升權限為管理者帳號進行操作。當使用者第 1 次執行 sudo 指令時系統會再次詢問該使用者密碼,當成功通過密碼驗證 (Authentication) 之後便會暫時切換授權 (Authorization) 身份為管理者帳號 root 來執行其指令,並且在 5 分鐘之內若該使用者再次執行 sudo 指令時,系統便不會再次詢問使用者密碼。

接下來我們著手來測試剛才設定的 sudo 記錄檔機制是否正常運作,請您另外開啟一個 SSH Client 視窗並使用一般使用者帳號遠端登入 CentOS 主機。例如,使用 weithenn 這個一般使用者帳號(請確定該使用者帳號已加入 wheel 群組)登入系統並嘗試執行 vipw 指令試圖修改使用者帳號設定檔內容,相信會得到權限被拒絕 (Permission denied) 的錯誤訊息回應。此時您可以使用 sudo 指令搭配剛才的 vipw 指令再次執行即可修改使用者帳號設定檔內容。
[weithenn@centos73 ~]$ vipw //嘗試修改使用者帳號設定
vipw: Permission denied.
vipw: Couldn't lock file: Permission denied
vipw: /etc/passwd is unchanged
[weithenn@centos73 ~]$ id //確認已加入 wheel 群組
uid=1000(weithenn) gid=1000(weithenn) groups=1000(weithenn),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[weithenn@centos73 ~]$ sudo vipw //搭配 sudo 機制提升權限

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] password for weithenn: //鍵入密碼,通過驗證程序執行提升權限

vipw: /etc/passwd is unchanged

圖、測試 sudo 機制

當上述指令執行完畢後您可以接著查看 sudo 記錄檔便會看到相關的記錄內容,從 sudo 記錄檔內容中我們可以確定 sudo 記錄檔機制目前正確運作中。從 sudo 記錄檔中可以清楚得知是在什麼時間點 (May 22 15:55:21)、系統中哪個使用者帳號 (weithenn)、在哪一台主機上 (centos73)、從遠端登入此台主機 (pts/1)、在系統中哪個路徑 (/home/weithenn)、切換成什麼身份 (root)、執行什麼指令 (/sbin/vipw)
[weithenn@centos73 ~]$ sudo tail /var/log/sudo.log
May 22 15:55:21 : weithenn : HOST=centos73 : TTY=pts/1 ; PWD=/home/weithenn ;
    USER=root ; COMMAND=/sbin/vipw

May 22 16:00:18 : weithenn : HOST=centos73 : TTY=pts/1 ; PWD=/home/weithenn ;
    USER=root ; COMMAND=/bin/tail /var/log/sudo.log

前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64) 映像檔,也就是新版 CentOS 7.3 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




設定 VIM 編輯器操作環境

VI (Visual Interface) 為 Unix-Like 預設內建的檔案編輯器,然而此編輯器對於 Linux 初學者來說比較容易感覺到使用不易。CentOS 作業系統預設會安裝較容易使用而且功能更為強大的檔案編輯器 VIM (Vi Imitation) ,建議 Linux 初學者可以使用此編輯器進行檔案編修,相信可以較為順手。

在本文環境中,因為採用的是 CentOS 7.3 Minimal Install,所以預設並不會安裝 VIM 套件而是使用預設的 VI。因此,若是覺得 VI 不順手的話可以使用指令「yum -y install vim」安裝 VIM 套件。

圖、安裝 VIM 套件

圖、VIM 套件安裝成功

此外,VIM 檔案編輯器預設功能雖然已經很強大,但是您仍可以依需求加上相關參數設定使得 VIM 編輯器更為強大更為貼近您的使用需求。以下為個人習慣設定的 VIM 參數設定值:
# cat .vimrc
set number
set hls
set ic
set ai
set enc=utf8
# source ~/.vimrc


當重新套用 VIM 編輯器環境設定後,再次嘗試編輯檔案便會發現 VIM 環境已經套用生效。

圖、VIM 環境設定套用生效



設定 Bash Shell 操作環境

對於許多 Linux 的使用者來說習慣的 Shell 應該是系統預設使用的 bash (Bourne-Again Shell),CentOS 預設支援的 Shell 除了有 bash 之外還支援 sh (Bourne Shell)csh (C Shell)tcsh (TENEX C Shell)ksh (Korn Shell) 等 Shell。基本上,使用哪種 Shell 全憑個人使用習慣也就是順手即可。

使用 Bash Shell 在不設定任何參數的情況下,便可以擁有按下【Tab】鍵,即自動補齊檔名及搜尋上一次輸入指令的功能。所謂【Tab】鍵補齊檔名功能是什麼意思呢?舉個例子來說,假如我們想要查看主機的日期及時間資訊時,會鍵入 date 指令,當輸入 da 之後便按下【Tab】鍵,此時作業系統會尋找系統中 da 開頭的相關指令,由於系統中 da 開頭的指令只有二個分別是 date 及 dateconfig。因此當按下【Tab】鍵進行補齊檔名功能時便會先自動補齊為 date 指令。

Bash Shell 的補齊檔名功能不僅僅能使用於指令方面,對於檔案及目錄也具有相同的功能。以搜尋上一次輸入指令的功能為例,分別輸入了 ls 某個目錄內容及 cd 到某個目錄內,當您想要再次執行時只要打 ls 再按【上方向鍵】則 Bash Shell 會自動找出最近執行過開頭為 ls 的指令,這樣的功能對於操作作業系統來說非常方便。

除了預設的功能之外我們可以設定 Bash Shell 的環境變數來加強操作的便利性,以剛才測試補齊檔名功能執行的 date 指令來說,其實該指令的完整路徑為 /bin/date,但是為何當我們輸入 date 指令按下 Enter 鍵後便可順利執行該指令? 這是因為預設的 tcsh Shell 環境設定檔中已經將作業系統經常會使用到的指令路徑載入環境變數中(參數 PATH),因此我們才可以在不用鍵入絕對路徑的情況下直接執行相關指令。

以採用 Bash Shell 為例當使用者登入 CentOS 主機後,該使用者帳號會依序載入「/etc/profile」通用環境設定檔,接著則是載入個人家目錄下的「~/.bash_profile」「~/.bashrc」個人環境設定檔。倘若,管理者設定的通用環境設定檔與個人環境設定檔內容發生衝突時,系統將會套用個人環境設定檔為最後結果(Last Match)。

當完成 Bash Shell 環境設定檔之後,可以使用指令「source ~/.bashrc」立即套用生效或是登出/登入也可以,以下為個人習慣設定於個人家目錄下 .bashrc 的個人環境設定檔內容:
# cat ~/.bashrc
setterm -blength 0
alias vi='vim -S ~/.vimrc'
alias ll='ls -al --color'
alias grep='grep --color'
alias h='history 100'
# source ~/.bashrc


當重新套用 Bash Shell 環境設定後,嘗試執行一下 grep 指令功能便會發現已經套用生效。

圖、Bash Shell 環境設定套用生效

前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64) 映像檔,也就是新版 CentOS 7.3 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




修改 SELinux 安全增強機制

Linux 作業系統從核心 2.6 版本開始預設會自動載入安全增強機制 SELinux ( Security-Enhanced Linux) 核心模組。SELinux 是由美國國家安全局 NSA (National Security Agency) 所開發,並且在 2000 年 12 月時將此核心模組發行給開放原始碼的開發社群,以便有效加強 Linux 整體安全性。

SELinux 為基於保護原則、作業系統中檔案結構及檔案權限的完整性原則所設計,此完整性原則可以有效針對入侵行為,以及企圖跨越系統安全架構等設計不良的應用程式對作業系統所造成的破壞,因此可以提供更安全的強制存取控制架構,來與作業系統的核心和主要子系統協同運作。在這樣的架構下相關的服務 (Daemon) 只能存取屬於該服務帳號所能存取的資料夾及檔案權限,若是超過所能存取的權限範圍則 SELinux 便會阻擋該服務的存取行為。所以若主機所架設的服務出現安全性漏洞導致被攻擊時 SELinux 能夠有效將攻擊所造成的損失降到最低。

簡單來說啟用了 SELinux 安全增強機制後的 Linux 作業系統,其檔案權限便不僅僅是傳統上的三種權限-讀取 r、寫入 w、執行 x-,及身份-擁有者 Owner、群組 Group、其它人 Others,而是整個主機內的檔案系統,將會套用更細微的權限及身份設定並且具有完整性架構。然而也因為 SELinux 安全增強機制及完整性原則,常常會造成 Linux 初學者因為不了解檔案系統及相關概念,進而導致設定相關網路服務時,因為違反了 SELinux 安全機制或者完整性原則,而導致網路服務無法啟動,或者無法存取系統資料(因為被 SELinux 安全機制給阻擋住了)。因此我通常會建議初學者可以先將此增強安全機制設定為警告通知,或者暫時關閉。等以後對於 CentOS 作業系統有更深的認識後再將此功能啟用。當然這樣的情況是自行測試或學習時,使用者若是用於企業營運時則強烈建議一定要開啟 SELinux 安全增強機制來提升及保護主機安全性。

要修改 SELinux 安全增強機制的設定,您可以透過修改「/etc/sysconfig/selinux」設定檔,或者使用指令 system-config-securitylevel 進入互動設定視窗進行設定之後再將主機重新啟動即可套用變更,SELinux 安全增強機制共有三種運作模式說明如下:

  • enforcing: 啟動模式 (預設值),SELinux 安全增強機制啟動將會阻擋不當的存取行為。
  • permissive: 寬容模式,當系統發生違反 SELinux 安全增強機制時僅僅顯示警告訊息而不會實際進行阻擋的動作,此模式很適合有心學習 SELinux 機制的學習者。
  • disabled: 停用模式,完全將 SELinux 安全增強機制停用。


建議您可以將設定值修改為寬容模式 (permissive),因為當您的操作行為違反 SELinux 安全增強機制時會顯示警告通知您,因此您可以有效學習到哪些操作或者哪些動作是會被 SELinux 阻擋哪些不會,這樣可以讓您日後真正開啟 SELinux 安全增強機制時,不致被卡住並且早日提升您所管理的主機系統整體安全性。您可以透過 sestatus 指令來判斷目前主機中 SELinux 的運作模式及狀態,此設定值變更後必須要將主機重新啟動才能套用變更,當重新啟動後請記得再次使用 sestatus 指令以便確認您的修改正確有效。

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28
# vi /etc/sysconfig/selinux
SELINUX=enforcing    //預設值 (啟動模式)
SELINUX=permissive   //修改後 (寬容模式)
# setenforce 0
# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy ZXname:           targeted
Current mode:                   permissive
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

圖、調整 SELinux 安全性增強機制

前言

最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.3 x86-64 (Kernel version 3.10.0-514.el7.x86_64) 映像檔,也就是新版 CentOS 7.3 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪



實作環境




停止及停用 NetworkManager 系統服務

建立好使用者帳號後接下來便是設定 CentOS 的網路功能,在本文設定中網路功能是以設定固定 IP 位址來進行說明。首先,在 CentOS 7.3 Minimal Install 運作環境中,執行「systemctl list-units --type service |grep running」指令後,可以看到預設仍會啟用 NetworkManager 系統服務,但個人的網路設定習慣不喜歡使用它,所以在組態設定 CentOS 主機網路環境之前,先執行「systemctl stop NetworkManager」指令以便停止 NetworkManager 系統服務,接著執行「systemctl disable NetworkManager」指令以便停用 NetworkManager 系統服務 (以避免 CentOS 主機重新啟動後不會自動執行)。

圖、停止及停用 NetworkManager 系統服務



組態設定主機名稱

預設情況下,採用 CentOS 7.3 Minimal Install 安裝模式後主機名稱為「localhost.localdomain」,你可以使用「hostname」「hostnamectl」指令進行查看。倘若,你希望能夠調整 CentOS 虛擬主機名稱時,可以執行「hostnamectl set-hostname "centos73.weithenn.org" --static」指令即可立即套用生效,後續再次使用「hostname」「hostnamectl」指令進行確認,可以發現 CentOS 主機名稱已經變更為「centos73.weithenn.org」。事實上,該指令將會把組態設定值套用至「/etc/hostname」組態設定檔當中。

圖、組態設定 CentOS 主機名稱



組態設定 CentOS 主機網路資訊

接著,我們直接透過相關組態設定檔的方式,設定 CentOS 主機的網路資訊分別將固定 IP 位址、網路遮罩等相關資訊寫入「/etc/sysconfig/network-scripts/ifcfg-eth0」網卡設定檔中、預設閘道寫入「/etc/sysconfig/network」設定檔中、DNS 名稱解析資訊寫入「/etc/resolve.conf」設定檔中。最後,便可以執行「systemctl restart network」指令重新啟動網路服務,然後再執行「systemctl status network」查看網路服務運作狀態。
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
IPV6INIT=no
DEVICE=eth0
ONBOOT=yes
IPADDR=172.21.11.73
PREFIX=24
# cat /etc/sysconfig/network
GATEWAY=172.21.11.254
# cat /etc/hosts
127.0.0.1 localhost
# cat /etc/resolv.conf
search weithenn.org
nameserver 168.95.192.1
nameserver 168.95.1.1
nameserver 8.8.8.8
# systemctl restart network
# systemctl status network
network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
   Active: active (exited) since Mon 2017-05-22 11:29:01 CST; 4min 54s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2143 ExecStop=/etc/rc.d/init.d/network stop (code=exited, status=0/SUCCESS)
  Process: 2315 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)
May 22 11:28:55 centos73.weithenn.org systemd[1]: Starting LSB: Bring up/down networking...
May 22 11:28:56 centos73.weithenn.org network[2315]: Bringing up loopback interface:  [  OK  ]
May 22 11:29:01 centos73.weithenn.org network[2315]: Bringing up interface eth0:  [  OK  ]
May 22 11:29:01 centos73.weithenn.org systemd[1]: Started LSB: Bring up/down networking.


圖、組態設定固定 IP 位址

當 CentOS 主機的網路服務重新啟動並套用新的組態設定後,接著便可以使用 ping 指令來判斷主機是否能順利連上網際網路及進行名稱解析的動作,或者藉此判斷此台主機的網路通訊是卡在哪個環節上以便除錯。
# ping -c2 127.0.0.1   //檢查 Loopback
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.053 ms
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.031/0.042/0.053/0.011 ms
# ping -c2 172.21.11.73   //檢查固定 IP 位址
PING 172.21.11.73 (172.21.11.73) 56(84) bytes of data.
64 bytes from 172.21.11.73: icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from 172.21.11.73: icmp_seq=2 ttl=64 time=0.053 ms
--- 172.21.11.73 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.030/0.041/0.053/0.013 ms
# ping -c2 172.21.11.254   //檢查 CentOS 與預設閘道之間的連線
PING 172.21.11.254 (172.21.11.254) 56(84) bytes of data.
64 bytes from 172.21.11.254: icmp_seq=1 ttl=255 time=0.465 ms
64 bytes from 172.21.11.254: icmp_seq=2 ttl=255 time=0.445 ms
--- 172.21.11.254 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.445/0.455/0.465/0.010 ms
# ping -c2 168.95.192.1   //檢查 CentOS 是否能夠與指定的 DNS 伺服器連線
PING 168.95.192.1 (168.95.192.1) 56(84) bytes of data.
64 bytes from 168.95.192.1: icmp_seq=1 ttl=248 time=1.72 ms
64 bytes from 168.95.192.1: icmp_seq=2 ttl=248 time=1.46 ms
--- 168.95.192.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.466/1.596/1.726/0.130 ms
# ping -c2 weithenn.org   //檢查 CentOS 能否順利進行名稱解析
PING weithenn.org (216.239.38.21) 56(84) bytes of data.
64 bytes from any-in-2615.1e100.net (216.239.38.21): icmp_seq=1 ttl=45 time=7.91 ms
64 bytes from any-in-2615.1e100.net (216.239.38.21): icmp_seq=2 ttl=45 time=8.72 ms
--- weithenn.org ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 7.918/8.321/8.724/0.403 ms


圖、檢查 CentOS 主機網路組態是否正確運作



沒有 ifconfig 及 netstat 指令?

CentOS 5 / 6 版本中,預設都會安裝 net-tools 套件 (包含 ifconfig / netstat 指令)。但是,從 CentOS 7 版本開始預設不會安裝該套件,原因是官方認為 ifconfig 指令無法完整顯示網路卡的 IP 位址組態設定,建議可以改用 ip 或 ss 等指令 (詳細資訊請參考 FAQ/CentOS7 - CentOS Wiki)。

倘若,仍希望使用 ifconfig / netstat 指令的話,只要執行「yum -y install net-tools」指令安裝 net-tools 套件即可。如下操作所示,在尚未安裝 net-tools 套件之前,並無法使用 ifconfig / netstat 指令,在完成安裝 net-tools 套件後便可以順利執行 ifconfig / netstat 指令。
# ifocnfig
-bash: ifocnfig: command not found
# netstat
-bash: netstat: command not found
# yum -y install net-tools
# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.21.11.73  netmask 255.255.255.0  broadcast 172.21.11.255
        inet6 fe80::215:5dff:feac:5915  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:ac:59:15  txqueuelen 1000  (Ethernet)
        RX packets 20688  bytes 13770965 (13.1 MiB)
        RX errors 0  dropped 2  overruns 0  frame 0
        TX packets 6043  bytes 509742 (497.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# netstat -tunpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State    PID/Program name
tcp        0      0 0.0.0.0:22     0.0.0.0:*        LISTEN   771/sshd
tcp        0      0 127.0.0.1:25   0.0.0.0:*        LISTEN   1092/master
tcp6       0      0 :::22          :::*             LISTEN   771/sshd
tcp6       0      0 ::1:25         :::*             LISTEN   1092/master




停用 IPv6

預設情況下,CentOS 主機會同時使用 IPv4 及 IPv6 網路功能,然而目前企業及組織的運作環境仍然相當少使用 IPv6 網路功能。因此,基於節省系統資源的概念下希望停用 IPv6 網路功能,如下操作結果可以看到使用「ifconfig eth0」指令有看到 inet (IPv4) 及 inet6 (IPv6)「netstat -tunpl」指令後,預設 SSH / Postfix 系統服務同時使用 IPv4 / IPv6 網路功能。
# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.21.11.73  netmask 255.255.255.0  broadcast 172.21.11.255
        inet6 fe80::215:5dff:feac:5915  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:ac:59:15  txqueuelen 1000  (Ethernet)
        RX packets 20688  bytes 13770965 (13.1 MiB)
        RX errors 0  dropped 2  overruns 0  frame 0
        TX packets 6043  bytes 509742 (497.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# netstat -tunpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State    PID/Program name
tcp        0      0 0.0.0.0:22     0.0.0.0:*        LISTEN   771/sshd
tcp        0      0 127.0.0.1:25   0.0.0.0:*        LISTEN   1092/master
tcp6       0      0 :::22          :::*             LISTEN   771/sshd
tcp6       0      0 ::1:25         :::*             LISTEN   1092/master


根據 CentOS Wiki  - FAQ/CentOS7 - How do i disable IPv6? 官方文件內容可知,應該在「/etc/sysctl.conf」設定檔中,加入「net.ipv6.conf.all.disable_ipv6 = 1」、「net.ipv6.conf.default.disable_ipv6 = 1」內容,然後執行「sysctl -p」指令以便停用 CentOS 主機的 IPv6 網路功能。
# vi /etc/sysctl.conf //加入下列 2 行參數
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# sysctl -p
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1


接著,根據官方文件的建議,應該修改 SSH 及 Postfix 組態設定檔內容,讓 SSH / Postfix 系統服務僅使用 IPv4 網路功能。
# vi /etc/ssh/sshd_config
#AddressFamily any  //預設值
AddressFamily inet  //修改後 (inet is ipv4 only, inet6 is ipv6 only)
# vi /etc/postfix/main.cf
#inet_interfaces = localhost  //預設值
inet_interfaces = 127.0.0.1   //修改後


修改完成後,建議重新啟動主機以便完整的套用生效。當 CentOS 主機重新啟動完成後,再次登入主機後使用「ifconfig eth0」指令發現已經沒有 inet6 (IPv6),而執行「netstat -tunpl」指令會發現預設的 SSH 及 Postfix 系統服務僅使用 IPv4 網路功能。
# ifconfig eth0
eth0: flags=4163 mtu 1500
inet 172.21.11.73 netmask 255.255.255.0 broadcast 172.21.11.255
ether 00:15:5d:ac:59:15 txqueuelen 1000 (Ethernet)
RX packets 20688 bytes 13770965 (13.1 MiB)
RX errors 0 dropped 2 overruns 0 frame 0
TX packets 6043 bytes 509742 (497.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# netstat -tunpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address   Foreign Address  State    PID/Program name
tcp        0      0 0.0.0.0:22      0.0.0.0:*        LISTEN   530/sshd
tcp        0      0 127.0.0.1:25    0.0.0.0:*        LISTEN   664/master