cockpit 改 port

cockpit 是 RHEL 現在主打的 web console,透過網站介面,就可以管理主機。Debian/Ubuntu/RHEL 都有把這個套件包進去。

預設在安裝以後,是不啟用的,需要使用以下指令來啟用

sudo systemctl enable cockpit.socket

port 的預設值是 9090,若需要改 Port 的話,可以透過以下指令來覆寫之前的設定

sudo systemctl edit cockpit.socket

編輯以後,輸入以下內容

[Socket]
ListenStream=
ListenStream=PORT_NUMBER

把 PORT_NUMBER 改為想要的 port 就可以。

修改完畢以後,用以下指令重新載入跟啟動

sudo systemctl daemon-reload
sudo systemctl restart cockpit.socket

RHEL8修復磁碟

Red Hat Enterprise Linux (RHEL) 7, 8, 9 的方法都一樣。

  1. 拿 RHEL 安裝光碟開機
  2. 開機選單進入 Troubleshooting
  3. 進入 Rescue a Red Hat Enterprise Linux System
  4. 進入終端機

有終端機就好辦事了。

Software RAID 就用 mdadm --assemble --scan ,這主要是用 RAID 工具去掃描磁碟並重組 RAID 。執行完,要用 cat /proc/mdstat 檢查看看。

LVM 就用 lvm vgchange -ay 去尋找並啟用 LVM。啟用成功以後,可以再檢查 LVM 相關設定看看 (/etc/lvm) 以及 Kernel 的開機參數 cat /proc/cmdline

先用 lsblk 或是 df -h 看看目前的磁碟跟掛載的分割區,通常無法掛載或是掛載成唯讀時,都表示可能有問題,這時候要用適當的修復指令去修復。

各種檔案系統的修復指令

  • ext2/ext3/ext4: e2fsck -fvy /dev/sdX
  • xfs: xfs_repair /dev/sdX
  • ReiserFS: reiserfsck /dev/sdX
  • Btrfs: btrfsck /dev/sdX
  • vfat: fsck.vfat /dev/sdX

修復好,可以掛載以後,要再把分割區掛載起來,檢查一下裡面的設定,例如 /etc/fstab ,/etc/lvm 等等的。

大致上是這樣,關於修復這部份,我覺得蠻吃經驗的,也需要對 Linux 開機過程有足夠的認識,這樣會比較好解決。

最後附帶一提,Ubuntu 也是用類似的方法來處理,Ubuntu 比較好的地方是用 LiveCD 開機完以後,有桌面環境可以用,這時就可以開終端機或是磁碟分割工具來使用,甚至也可以配置網路,用瀏覽器去查找資料來處理。

nice and renice

之前在準備考試時,看到的一篇文,裏面有解說跟實驗,寫的很好。

A brief guide to priority and nice values in the linux ecosystem

以下做筆記

  1. Linux 裡每個程序有 CPU 優先權,這個值是可以使用 nice 跟 renice 調整的,主要是讓程序可以得到更多一點的 CPU 使用權。
  2. nice 指令是啟動程序時就要帶入優先權的: nice -n 10 your_prog
  3. renice 指令可以在啟動程序之後去做調整: renice -n 10 -p pid
  4. 優先權的值是依照使用者身份而定,root 可以設定 -20~19 ,一般使用者可以設定 0~19
  5. 優先權的數值愈小,表示優先權越高,Kernel 裡面的計算方式是用 “優先權的數值 + 20” 。

一般來說很少會去調整這個優先權,都是讓 Kernel 自行去調控。

禁用ctrl+alt+del

這個其實我不太會去關掉,但蠻多公司都會把這個關閉,避免不小心按到,導致伺服器重新開機。另外跟安全漏洞也有關係,有人會利用這個熱鍵來做壞事。

用 systemd 的話,蠻簡單的,ctrl+alt+del 被設定為一個 target,所以可以用 systemctl disable 跟 systemctl mask 來關閉。

systemctl disable ctrl-alt-del.target
systemctl mask ctrl-alt-del.target

但是,systemd 有埋一個機關,就是兩秒內連續按下七次,他仍然會重新開機 ( man systemd-system.conf 可找到),所以最好也在 /etc/systemd/system.conf 裡加入以下設定

CtrlAltDelBurstAction=none

然後重新載入設定

systemctl daemon-reexec

若是在 RHEL 8 使用 GUI,還需要加一個地方,新增 /etc/dconf/db/local.d/00-disable-CAD ,內容如下

# /etc/dconf/db/local.d/00-disable-CAD 
[org/gnome/settings-daemon/plugins/media-keys]
logout=''

新增以後,執行 dconf update 來讓設定生效。

RHEL8系統加密原則(SSH)

在 Red Hat Enterprise Linux 8 以後導入了整合的加密原則管理,透過 update-crypto-policies 指令就可以很方便的去設定系統加密原則。

使用以下指令就可以看到使用哪個原則

update-crypto-policies --show

預設都是 DEFAULT

若需要設定為 FUTURE 可以用

update-crypto-policies --set FUTURE

Red Hat 有針對這部份撰寫一篇 KB: System-wide crypto policies in RHEL ,說明是如何運作的。在產品手冊裡也有提到這部份:Chapter 4. Using system-wide cryptographic policies。若有需要客製化,可以參考 Red Hat 的另外一篇 How to customize crypto policies in RHEL 8.2 來進行客製化。

接下來講一下 sshd 的部份,一般若要讓 sshd 使用指定的金鑰交換原則或是加密原則,會說要去修改 /etc/sysconfig/sshd ,把裡面的

# System-wide crypto policy:
# To opt-out, uncomment the following line
#CRYPTO_POLICY=

改為

# System-wide crypto policy:
# To opt-out, uncomment the following line
CRYPTO_POLICY=

然後再去修改 /etc/ssh/sshd_config 。

這個設定實際上會影響的地方是 sshd systemd service ,我們可以用 systemctl cat sshd 來看看

# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target

[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

從這邊可以看到有兩行 EnvironmentFile,第一行 EnvironmentFile 去含括 /etc/crypto-policies/back-ends/opensshserver.config ,這就是系統的 ssh 加密原則設定。第二行 EnvironmentFile 含括的檔案,就是前面提到的 /etc/sysconfig/sshd 。

那在 ExecStart 這行可以看到啟動 sshd 時,有放置 $CRYPTO_POLICY ,表示會使用這個環境變數的內容。也因此,若在 /etc/sysconfig/sshd 裡移除 CRYPTO_POLICY 的註解,在啟動 sshd 時,就不會帶入參數,而使用 /etc/ssh/sshd_config 裡的設定。

在查到這邊時,我才想起之前好像有找過,但之前沒有記錄,沒記錄就容易忘記,所以今天特別記下來。

net-snmp

最近試著架設了 SNMP,SNMP 的運作跟 Prometheus 相似,SNMP Agent 相當於 nodeexporter ,提供 Agent 所在的主機資訊;需要知道該台主機資訊的管理主機,就用 SNMPWalk 去抓取主機資訊,這就相當於 Prometheus。

在 RHEL8 裡的安裝很簡單

sudo yum install -y net-snmp net-snmp-utils

安裝完成,就啟用 SNMP Agent,這個 snmpd 就是 SNMP Agent。

# 啟用 SNMP Agent 服務
sudo systemctl enable --now snmpd

# 開啟防火牆
sudo firewall-cmd --add-service=snmp --permanent
sudo firewall-cmd --reload

啟用之後,就可以取得基本的系統資訊。

可以用以下指令確認

snmpwalk -v1 -c public <IP>

如果要提供額外的系統資訊,就需要再增加設定,例如網路介面資訊、磁碟資訊或是負載,就需要在 /etc/snmp/snmpd.conf 裡去增加以下設定

# 網路介面資訊
view    systemview    included   .1.3.6.1.2.1.2
view    systemview    included   .1.3.6.1.2.1.6
view    systemview    included   .1.3.6.1.2.1.7

# 磁碟資訊
disk / 10%
view    systemview    included   .1.3.6.1.4.1.2021.9

# 負載
load 12 14 14
view    systemview    included   .1.3.6.1.4.1.2021.10

驗證是否有輸出這些資訊,一樣也是用 snmpwalk

snmpwalk -v1 -c public <IP> system
snmpwalk -v1 -c public <IP> interfaces
snmpwalk -v1 -c public <IP> .1.3.6.1.4.1.2021.9
snmpwalk -v1 -c public <IP> .1.3.6.1.4.1.2021.10

透過 SNMP 可以很方便的取得主機資訊,管理時可以利用這些資訊,而無需登入該台主機。但這樣對於駭客來說,也便利很多,他們能透過 SNMP Agent 得到主機的資訊,進而做出攻擊。因此在實務上會建議使用 SNMP v3 ,加入驗證,只允許讓特定的使用者才能取得資訊,這部份下一篇再來介紹。

參考資訊

difftastic

終端機模式下檔案的比對是個很常見的場景,我知道的作法有兩個。

第一個是使用 diff -Naur <file1> <file2> ,這方法的好處是隨處可得,一般來說安裝完基本系統,就會有這個指令可以使用。缺點是不容易閱讀,你需要稍微知道他的規則才可以。

第二個方法是使用 vimdiff ,這個指令一般在安裝 vim 以後,就會有,需要熟悉 vim 操作,也需要知道 folding 的熱鍵怎麼用。好處是分左右兩邊呈現,容易閱讀。

後來知道有不錯的指令列工具可以使用,像是今天要介紹的 difftastic,他可以分左右兩邊呈現,可以單獨呼叫,也可以結合 git 使用,缺點就是要另外安裝,例如 RHEL/Ubuntu 還沒包這個套件。

安裝

下載位址:https://github.com/Wilfred/difftastic/tags

下載,解壓縮以後,把 difft 這個檔案複製到 /usr/local/bin 即可。

使用

difft <file1> <file2>

輸出結果

$ difft /tmp/foo.txt /tmp/bar.txt
/tmp/bar.txt --- Text
1 1111                                                       1 1214
2 22                                                         2 22
3 33                                                         3 99
4 44                                                         4 44
5 55                                                         5 55
6 66                                                         6 66

相異的地方有顏色呈現,很清楚,這部份可以參考 github 上的網頁。

要搭配 git 使用,可以參閱手冊:https://difftastic.wilfred.me.uk/git.html

設定方法可以使用環境變數,也可以用 git config 來設定。

環境變數的方式

export GIT_EXTERNAL_DIFF=difft

使用 git config 的方式。

# Set git configuration for the current repository.
$ git config diff.external difft

# Set git configuration for all repositories.
$ git config --global diff.external difft

有了 difftastic,在比對檔案上就方便許多,省下許多看錯的困擾。

SUID/GUID/Sticky bit permission

以前知道 SUID, GUID,最近要考試,才知道有 sticky bit permission。

閱讀這篇:What is sticky bit permission, and how to use it – TREND OCEANS 以後,做了點整理,幫助自己了解。

SUID 是指執行這個程式的時候,是用 owner 身份執行;GUID 是指執行這個程式的時候,試用 owner group 的身份執行。這兩個設定有點危險,因為這會讓執行程式的使用者可以用 owner/owner group 的身份執行程式,進而做到一些可能危害系統的事情。

設定方法

chmod u+s program1
chmod g+s program1

要注意的是,SUID/GUID 只能設定在二進位的執行檔上,不能設定在腳本上。

對目錄設定 sticky permission 的話,表示只有 root 跟 owner 可以刪除該目錄。

設定方法

chmod o+t dir1
chmod 1755 dir1

參考資料

SSH跳板

在 Red Hat Enterprise Linux 8 的手冊裡看到 SSH 跳板,記錄一下。

首先在 ${HOME}/.ssh/config 裡新增跳板機的資訊

Host jump-server1
  HostName jump1.example.com

接著在要連過去的主機資訊裡,填入

ProxyJump <跳板機名稱>

例如

Host remote-server
  HostName remote1.example.com
  ProxyJump jump-server1

之後使用 ssh remote-server 時,會先連到 jump1.example.com 這台主機 ,再連接到 remote1.example.com 這台主機。

之前不知道這方法時,都是先連到 jump1.example.com,然後再輸入 ssh remote1.example.com 這樣,有點笨。

現在使用 ProxyJump ,會方便很多,少打不少字。

其他參考資料:https://www.redhat.com/sysadmin/ssh-proxy-bastion-proxyjump

cockpit

還記得以前有個可以管理 Linux 主機服務的軟體,叫作 webmine,有一陣子蠻常用的,但後來還是回歸到終端機敲指令方式來管理。

這兩年用了 Red Hat Enterprise Linux ,登入時,頻頻看到說可以啟用 cockpit 來做管理,在看管理手冊的時候,也發現有獨立的章節在介紹,所以就裝起來試試看了。

優點是,不需要使用到特權帳號,登入時,使用本機帳號就可以登入,而且有 Plugin 機制,在安裝 Plugin 之後,就有了新的功能。

安裝

在 cockpit 的網站上就有描述各種 Linux 發行版的安裝方式:Running Cockpit

RHEL

sudo yum install cockpit
sudo systemctl enable --now cockpit.socket
sudo firewall-cmd --add-service=cockpit
sudo firewall-cmd --add-service=cockpit --permanent

ArchLinux

sudo pacman -S cockpit
sudo systemctl enable --now cockpit.socket

Debian/Ubuntu

sudo apt install cockpit
sudo systemctl enable --now cockpit.socket

使用

在安裝並啟用以後,就可以開啟瀏覽器,在網址列輸入 https://<ip>:9090 進入 cockpit 的網頁管理畫面進行管理。

這個管理介面也可以管理多台 Linux 主機,就透過左上角的下拉選單,去新增主機就可以。

結語

就功能面來說並沒有像 webmine 那麼的豐富 (或者說是複雜),但以管理來說是相當實用的工具。