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 那麼的豐富 (或者說是複雜),但以管理來說是相當實用的工具。

find + egrep

使用 find 多半是用 wildchar 萬用字元來搜尋,使用方法簡單。但有些場景就需要用 regular expression 來找符合特定格式的檔名,這時候 find 可以勝任嗎?

find 指令提供了 -regex 參數,就可以使用此參數來指定格式;搭配的參數是 -regextype ,regular expression 雖說用法大致一樣,但語言難免都有方言存在,因此可以用這個參數來指定要用哪種 regular expression 的方言。

所以若是要在 LOG_DIR 目錄下找符合 app.log.2022-10-11 這樣類型的檔名然後做壓縮,就可以這樣寫:

find "${LOG_DIR}" \
    -type f \
    -regextype 'posix-egrep' \
    -regex '.*app\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}$' \
    -exec gzip {} \;

說明如下

  1. -regextype 前面說過是指定 regular expression 的方言,可以指定這些 awk, egrep, emacs, gnu-awk, grep, posix-awk, posix-basic, posix-egrep, posix-extended ,這邊我們用 posix-egrep ,確保符合 posix 標準。
  2. -regex 的格式最前面使用了 .* ,這是因為 find 輸出時的檔名會包含 LOG_DIR 路徑,所以必須用 .* 來表示格式之前有可能有任何字元。
  3. egrep 不能用 \d ,必須要用 [0-9] 才行,所以這邊用 [0-9]{4} 表示連續四個數字,[0-9]{2} 表示連續兩個數字。

find 搭配 regex 就可以更有彈性的去找出符合格式的檔名,不需要遷就 wildchar 了。

參考資料

Debian/Ubuntu 自動更新

要如何設定 Debian/Ubuntu 自動做更新呢?這可以使用 dpkg-reconfigure -plow unattended-upgrade 來設定

sudo dpkg-reconfigure -plow unattended-upgrades

執行指令後,會跳出視窗詢問是否要自動更新,選擇 Yes 就可以了。執行以後,會更新 /etc/apt/apt.conf.d/20auto-upgrades 這個檔案的內容

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

如果有不想自動更新的套件,可以用黑白名單來設置,這邊可以參考 /etc/apt/apt.conf.d/50unattended-upgrades 檔案裡的範例來設定。

有些套件在更新後,會需要重新開機,unattended-upgrade 也可以做到自動重開機,主要是在 /etc/apt/apt.conf.d/20auto-upgrades 加入以下設定

//Unattended-Upgrade::Automatic-Reboot "false";
//Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
//Unattended-Upgrade::Automatic-Reboot-Time "02:00";

除了可以指定是否自動重開機外,也可以指定自動重開機的時間。

了解 Debian/Ubuntu 如何自動更新以後,相信在管理主機上會更為輕鬆。

參考資料

RHEL8/CentOS8 grubby

上週幫客戶處理問題時,對 RHEL8/CentOS8 的 grub 又多了解了一些,記錄一下。

Ubuntu 的選單是放在 /boot/grub/grub.cfg ,所以看這個檔案,就大略知道選單有哪些選項,修改可以直接改這個檔案。RHEL8 跟 CentOS8 使用 grubby 來管理開機時的 grub 選單,所以可以用 grubby 指令來做管理。

常用的指令可以參考 12 practical grubby command examples (cheat sheet)

我這次主要使用到的指令有

  • 列出開機選單項目的資訊
  • 修改該選單項目的 kernel options
  • 取得目前預設開機項目
  • 設定預設開機項目

列出開機選單項目的資訊

列出選單項目,可以用下面指令

grubby --info=ALL | grep -E "^kernel|^index"

取得 index 跟 kernel ,就可以修改指定項目的 kernel options 了。

修改指定選單項目的 kernel options

修改的指令如下

# 修改指定的 kernel 的 kernel options,路徑可參考上面指令
grubby --update-kernel=<kernel路徑> --args="ipv6.disable=1"
# 修改目前的
grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ipv6.disable=1"

若要移除 kernel options,要用 –remove-args

# 移除指定的 kernel 的 kernel options
grubby --update-kernel=<kernel路徑> --remove-args="ipv6.disable=1"
# 移除目前 kernel 的 kernel options
grubby --update-kernel=/boot/vmlinuz-$(uname -r) --remove-args="ipv6.disable=1"

這裡的修改,會影響到 /boot/loader/entries 目錄下的檔案。

取得目前預設開機項目

grubby --default-index
grubby --default-title

設定預設開機項目

用以下指令設定

grubby --set-default="/boot/vmlinuz-4.18.0-193.1.2.el8_2.x86_64"
grubby --set-default-index=2

這裡設置以後,會影響到 /boot/grub/grubenv 的檔案內容。

可惜 ubuntu 沒有 grubby,感覺這在管理開機選單上還蠻方便的。

archlinux keyserver

昨晚用 yay 更新套件時,出現 gnupg key 問題,說套件無法驗證,試著用下面指令去更新 key 也有問題。

sudo pacman-key --refresh-keys

後來查到這篇:gpg – sks-keyservers gone. What to use instead? – Unix & Linux Stack Exchange

文章說可能是 keyserver 問題,就去改 /etc/pacman.d/gnupg/gpg.conf 裡的 keyserver,改了還是有問題。

最後才找到這篇:PSA: you need to update your keyserver : archlinux ,提到不是只改一個地方就好,以下這幾個位置的設定檔都要改。

  • /etc/pacman.d/gnupg/gpg.conf
  • ~/.gnupg/gpg.conf

我後來是修改為 keyserver hkp://keyserver.ubuntu.com ,經過這樣修改以後,就可以順利更新 key 跟套件了。

bash 檢查檔案是否為空的

我忘記為什麼會要找這個,總之,要檢查檔案不是空的,可以用 -s 。

這用 man test 可以查到, -s 的說明是這樣的:True if file exists and has a size greater than zero.

當檔案存在而且長度大於 0 時,回傳 True。換言之,False 時,就代表檔案的長度是 0 (空的)。

我是在 StackOverflow 找到的:linux – How to check if a file is empty in Bash? – Stack Overflow

if [ -s diff.txt ]; then
        # The file is not-empty.
        rm -f empty.txt
        touch full.txt
else
        # The file is empty.
        rm -f full.txt
        touch empty.txt
fi