Linux Administration

校時與時區設定

Chrony

Built-in on CentOS

Install

yum install chrony

Config: /etc/chrony.conf

# NTP Public Servers for Taiwan
server tw.pool.ntp.org
server time.stdtime.gov.tw
server clock.stdtime.gov.tw
server jp.pool.ntp.org

# Allow NTP client access from local network.
#allow 192.168.0.0/16

Starting

systemctl start chronyd

Verify

[root@localhost ~]# chronyc tracking
Reference ID    : 7A75FDF6 (static.home.twn.sciuridae.cloud)
Stratum         : 3
Ref time (UTC)  : Sun Aug 16 03:35:36 2020
System time     : 0.000073180 seconds slow of NTP time
Last offset     : -0.001259724 seconds
RMS offset      : 0.001259724 seconds
Frequency       : 21.057 ppm slow
Residual freq   : -0.000 ppm
Skew            : 28.166 ppm
Root delay      : 0.032856792 seconds
Root dispersion : 0.002069760 seconds
Update interval : 64.3 seconds
Leap status     : Normal

systemd-timesyncd

Build-in on Ubuntu

timedatectl

# See the information of the datetime
timedatectl

# List timezones supported
timedatectl list-timezones

# Change the system’s timezone
sudo timedatectl set-timezone Asia/Taipei

 

 

系統管理技巧

完整複製 Home 目錄

由於 User 的 Home 目錄內有許多隱藏檔,若要完整複製它們,有兩個方法:

方法一:可以複製成一個新目錄

cd /home
cp -a user1/ user1_new/

方法二:複製到一個現有目錄內

cd /home
cp -a user1/.[^.]* user1_new/ 

手動建立一個新的 Home 目錄

cp -r /etc/skel /home/user1
chown -R user1.group1 /home/user1
chmod 0700 /home/user1 
清除 Zombie 程序(defunct)

One may deal with zombie processes in any one of the following ways:

列出 zombie processes

ps aux |grep "defunct"
ps aux |grep Z

# How many Zombie process running on your server
ps aux | awk {'print $8'}|grep -c Z

# List the PID of Zombie
ps aux | awk '{ print $8 " " $2 }' | grep -w Z

Kill zombie process

# find the parent process list
pstree -paul

kill -9 <PARENT-PID>

RHEL Documents:

rsh

rsh server

# install on CentOS 6/7
yum install rsh-server

# Startup the service on CentOS 6
chkconfig rsh on
chkconfig rlogin on
service xinetd reload

# Startup the service on CentOS 7
systemctl start rsh.socket
systemctl start rlogin.socket
systemctl start rexec.socket
systemctl enable rsh.socket
systemctl enable rlogin.socket
systemctl enable rexec.socket
strace 程式除錯
# Trace the command
strace df -h

# Trace the process ID
strace -p 33259

# Get Summary of Linux Process
strace -c -p 3569

# Print Instruction Pointer During System Call
strace -i df -h

# Show Time of Day For Each Trace Output Line
strace -t df -h

# Print Command Time Spent in System Calls
strace -T df -h

# Trace Only Specific System Calls
strace -e trace=write df -h
strace -p 3569 -e poll

 

Q & A

ARP Cache 不會更新

問題說明:兩部相同規格的 Linux 主機,平時互作備援,網路設定各有一個固定 IP 與共用一個 VIP,VIP 使用 Alias IP 方式。每次移動 VIP 至另一部主機時,都會遇到其他鄰近的不同 vLAN 的主機無法 ping 這 VIP,原因是它們的 Switch 設備與 Core Switch 不會立即更新 ARP Cache,直到 Switch 上設定的 ARP 更新間隔時間到達。

解決方案:要讓 Core Switch 立即更新 ARP Cache,可以再切換 VIP 後,從目的端 Linux 主機上執行

arping -I eth1 your.vip.address
NFS 遠端目錄無法卸載

當遭遇某些異常情況時,原先的 NFS 目錄可能無法用指令 umount 正常卸載,且主機因為還在營運生產中,不能執行重開機時,下述的指令可能會有幫助。

# 檢查那些程序及用戶使用該目錄
fuser -m -v <mount_point>
lsof | grep <mount_point>
lsof +f -- <path-to-dir>

# 刪除無效的程序
fuser -i -k <mount_point>

# 以上都無效,可重啟 NFS Client daemon,但其他 NFS 目錄也會被迫中斷。
service netfs stop
service netfs start

# 網友提供的另一個方法
umount -l <mount_point>
Can't mount remotely Linux host on AIX

Try to run the following commands on your AIX.

nfso -o nfs_use_reserved_ports=1
nfso -o portcheck=1
Remove Shared Memory
# see all shared memory segments
# status: dest -> destroyed
# nattach: how many application being attached to the shared memory. 
ipcs -m
ipcs -m -i <shmid>

# remove the shared memory segment
ipcrm shm <shmid>
ipcrm -m <shmid>

 

 

SELinux

安全增強式 Security-Enhanced Linux(SELinux)是一個在內核中實踐的強制存取控制(MAC)安全性機制。SELinux 首先在 CentOS 4 出現,並在其後的 CentOS 發行版本獲得重大改善。這些改善代表用 SELinux 解決問題的方法亦隨著時間而改變。

基本指令

To check if SELinux is enabled

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

# getenforce
Permissive

To temporarily set SELinux to Enforcing/Permissive

# setenforce 1   // Enforcing

# setenforce 0   // Permissive

Permanently change SELinux
Edit the file /etc/selinux/config

## Change this line 
SELinux=disabled
延伸閱讀

 

 

 

patch & diff

單一檔案
# 建立更新檔
diff -uN old.code new.code > patch.file

# 套用更新檔
patch < patch.file

# 回復更新前
patch -RE < patch.file
連續多個檔案
# 建立更新檔
diff -rupN olddir newdir > patch.dir

# 套用更新檔
patch -p1 < patch.dir

# 回復更新前
patch -RE -p1 < patch.dir
找出內容不一致的檔案
# 目錄一: asterisk_orig/
# 目錄二: asterisk_patched/

cd asterisk_orig; find ./ -name "*.c" -exec md5sum -b {} \; > ../asterisk_orig.md5; cd ../
cd asterisk_patched; find ./ -name "*.c" -exec md5sum -b {} \; > ../asterisk_patched.md5; cd ../

diff asterisk_orig.md5 asterisk_patched.md5 

273c273
< 894a111d1efa5901471820e203503039 *./channels/chan_sip.c
---
> 00116baac23473049b5801c9287fb4be *./channels/chan_sip.c

前提是 asterisk_orig 與 asterisk_patched 目錄架構及檔案名稱必須完全一樣,這通常用來找出 asterisk_patched 目錄內被更新過了哪些 .c 檔案。

diff 與 curl 的應用
diff <(curl http://somesite/file1) <(curl http://somesite/file2)

Subnet mask v.s. CIDR

Netmask                  Netmask (binary)             CIDR     Notes    
 _____________________________________________________________________________ 
255.255.255.255  11111111.11111111.11111111.11111111  /32  Host (single addr) 
255.255.255.254  11111111.11111111.11111111.11111110  /31  Unuseable 
255.255.255.252  11111111.11111111.11111111.11111100  /30    2  useable 
255.255.255.248  11111111.11111111.11111111.11111000  /29    6  useable 
255.255.255.240  11111111.11111111.11111111.11110000  /28   14  useable 
255.255.255.224  11111111.11111111.11111111.11100000  /27   30  useable 
255.255.255.192  11111111.11111111.11111111.11000000  /26   62  useable 
255.255.255.128  11111111.11111111.11111111.10000000  /25  126  useable 
255.255.255.0    11111111.11111111.11111111.00000000  /24 "Class C" 254 useable  
255.255.254.0    11111111.11111111.11111110.00000000  /23    2  Class C's 
255.255.252.0    11111111.11111111.11111100.00000000  /22    4  Class C's 
255.255.248.0    11111111.11111111.11111000.00000000  /21    8  Class C's 
255.255.240.0    11111111.11111111.11110000.00000000  /20   16  Class C's 
255.255.224.0    11111111.11111111.11100000.00000000  /19   32  Class C's 
255.255.192.0    11111111.11111111.11000000.00000000  /18   64  Class C's 
255.255.128.0    11111111.11111111.10000000.00000000  /17  128  Class C's 
255.255.0.0      11111111.11111111.00000000.00000000  /16  "Class B"       
255.254.0.0      11111111.11111110.00000000.00000000  /15    2  Class B's 
255.252.0.0      11111111.11111100.00000000.00000000  /14    4  Class B's 
255.248.0.0      11111111.11111000.00000000.00000000  /13    8  Class B's 
255.240.0.0      11111111.11110000.00000000.00000000  /12   16  Class B's 
255.224.0.0      11111111.11100000.00000000.00000000  /11   32  Class B's 
255.192.0.0      11111111.11000000.00000000.00000000  /10   64  Class B's 
255.128.0.0      11111111.10000000.00000000.00000000  /9   128  Class B's 
255.0.0.0        11111111.00000000.00000000.00000000  /8   "Class A"   
254.0.0.0        11111110.00000000.00000000.00000000  /7 
252.0.0.0        11111100.00000000.00000000.00000000  /6 
248.0.0.0        11111000.00000000.00000000.00000000  /5 
240.0.0.0        11110000.00000000.00000000.00000000  /4 
224.0.0.0        11100000.00000000.00000000.00000000  /3 
192.0.0.0        11000000.00000000.00000000.00000000  /2 
128.0.0.0        10000000.00000000.00000000.00000000  /1 
0.0.0.0          00000000.00000000.00000000.00000000  /0   IP space

ps

以 PID 查詢

ps -fp <PID>
ps -fp <PID#1>,<PID#2>,<PID#3> 

分析CPU/Memory使用
CPU 使用率最高前10排名

# for CentOS
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -11

ps aux | head -1; ps aux | sort -rn +2 | head -10
# or
ps aux | head -1; ps aux | sort -rn -k 3 | head -10

Memory 使用率最高前10排名

# for CentOS
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -11

ps aux | head -1; ps aux | sort -rn +3 | head
# or
ps aux | head -1; ps aux | sort -rn -k 4 | head

ps -eo cmd,pid,ppid,%mem,%cpu --sort=-%mem | head -n 6

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -rn | head -25

優先權最高的程序

ps -eakl | sort -n +6 | head
# or
ps -eal | sort -n -k 7 | head

程序以 nice 值排序

ps -eakl | sort -n +7

ps -eal | sort -n -k 8

程序以執行時間排序

ps vx | head -1;ps vx | grep -v PID | sort -rn +3 | head -10

ps vx | head -1;ps vx | grep -v PID | sort -rn -k 4 | head -10

程序以 I/O 排序

ps vx | head -1; ps vx | grep -v PID | sort -rn +4 | head -10

ps vx | head -1; ps vx | grep -v PID | sort -rn -k 5 | head -10

等待中的程序

ps vg | head -1; ps vg | grep -w wait

指定 PID 的啟動時間與總執行時間

ps -p <PID> -o etime,start

每個用戶的程序數量

ps -ef | awk '{print$1}' | sort | uniq -c | sort -nr

Rsync

限制傳檔的網路頻寬
--bwlimit=30000

30000 = 30000 KB/ps = 30 MB/ps

本機內不同個資料夾做複製或同步
rsync -av --delete --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
遠端複製大檔案需要續傳
rsync --partial --progress --rsh=ssh <local_file> user@host:<remote_file>
複製 Linux 整個系統
mount /dev/sdb1 /mnt
rsync -aAXv / --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /mnt

 

screen

screen 常用指令
啟用 screen
#> screen
or
#> screen -S <session-name>

列出所有 session
#> screen -ls

取回 (resume) 某個 session
#> screen -r <session-id>

無法取回 session 時,先 deattach 在 resume
#> screen -D <session-id>
#> screen -r <session-id>

強制終止 session
#> screen -X -S <session-id> kill

結束 screen 的 session
#> exit

進入複製模式,可複製視窗上指定的文字,操作方式:
使用方向鍵任意移動游標,按一次 space 開始標記游標的文字,再按一次 space 結束標記文字並離開複製模式。
Ctrl-a + [
要貼上剛複製的內容
Ctrl-a + ]  
screen 用來連接 RS232
screen /dev/ttyACM0 115200

TIP: 如果出現 screen is terminating,須改用 sudo。

環境配置檔

~/.screenrc:

# Start message
startup_message off

# Disable vbell
vbell off

# Set hardstatus always on
hardstatus alwayslastline " %-Lw%{= Bw}%n%f %t%{-}%+Lw %=| %M %d %0c:%s "

# Set default encoding using utf8
defutf8 on

# 
term xterm

# Set the number of scrollback lines
#defscrollback 10000

# Fix termcapinfo for xterm to allow column resizing
# xterm emulation is used by PuTTY
# Uncomment the line below if running on CentOS 6.x/7.x 
#termcapinfo  xterm Z0=\E[?3h:Z1=\E[?3l:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l

# Fix termcapinfo for cleaning the terminal after detach
# Uncomment the line below if running on AIX 7.x
#termcapinfo xterm*|rxvt*  te=\E[?1049l:ti=\E[?1049h:

TIPs:

start_message 關閉開啟後的提示訊息

vbell                      關閉可以避免按 tab 出現閃畫面

hardstatus        在畫面下方固定顯示視窗編號,非常實用的功能

defscrollback  回捲內容的行數

進入 screen 模式後指令

基本操作

離開 screen 但不中止 session (deattach)

Ctrl-a + d

離開 screen 並中止 session

Ctrl-a + k

複製模式

進入複製模式,可複製視窗上指定的文字,操作方式:
使用方向鍵任意移動游標,按一次 space 開始標記游標的文字,再按一次 space 結束標記文字並離開複製模式。

Ctrl-a + [

貼上剛複製的內容

Ctrl-a + ]  

多視窗操作

水平切割 <Ctrl-a> + |

垂直切割 <Ctrl-a> + S

切換視窗 <Ctrl-a> + tab

目前視窗最大化 <Ctrl-a> + Q

移除目前視窗 <Ctrl-a> + X     ;這不會終止 session

多個終端機操作

新增一個 screen 終端機

<Ctrl-a> + c

或者是在目前的 screen 終端機再執行一次 screen
NOTE:如果已經 deattach,再執行 screen 時,會開啟另一個不同的 screen 終端機

檢視目前已開啟的所有視窗

<Ctrl-a> + w

移動至前一個或後一個終端機

<Ctrl-a> + p 前一個 (視窗編號減一)

<Ctrl-a> + n 後一個 (視窗編號加一)

<Ctrl-a> + 視窗編號

Q & A

用 Putty 連線,每次 attach 時,視窗都會自動縮回預設大小

將設定檔以下這行移除註解

termcapinfo  xterm Z0=\E[?3h:Z1=\E[?3l:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l 
用 tab 時,畫面都會閃一下,該如何解決

在 $HOME 目錄內新增 .screenrc

vbell off
如何很快的確認,目前是否在 screen 終端機內

Ctrl + a + a

拾人牙慧

系統管理
FTP/SFTP
RedHat

fsck

教學連結

Cheat Sheets

Curl

Markdown

VS Code

Git

MySQL/MariaDB

Systemd

簡介

Linux 的各項服務管理一直都是用 SysV Init Script,Systemd 是新的管理工具,在 CentOS 7 開始已經有支援。

設定上比 SysV Init 簡單許多,指令的操作差異不大。

線上教學:

支援的 Linux:

其他類似應用:

相關目錄:

服務設定檔

/etc/systemd/system/backup.service

[Unit]
Description=Backup daemon

[Service]
Type=simple
ExecStart=/path/to/backup

[Install]
WantedBy=multi-user.target

TIP:

multi-user.target 這是表示 Run Level 3

更多資訊可以前往 http://0pointer.de/blog/projects/systemd-for-admins-3.html

新增一個服務設定檔

/etc/systemd/system/freepbx.service

[Unit]
Description=Freepbx
After=mariadb.service
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/fwconsole start
ExecStop=/usr/sbin/fwconsole stop
 
[Install]
WantedBy=multi-user.target

將服務設為自動啟用

systemctl enable freepbx

服務管理

啟動服務

# Reload Systemd
systemctl daemon-reload

# 啟動服務
systemctl start <service-name>

# 檢查服務狀態
systemctl status <service-name>
systemctl is-active <service-name> 
systemctl is-enabled <service-name>

# 關閉服務
systemctl stop <service-name>

# 啟用:自動啟動
systemctl enable <service-name>

# 關閉:自動啟動
systemctl disable <service-name>

# 列出設為自動啟用的服務
systemctl list-unit-files --type=service --state=enabled

檢視服務清單

# list active services
systemctl list-units --type=service

# List all the running systemd services
systemctl list-units --type=service --state=running

# List all loaded systemd services including the inactive ones
systemctl list-units --all --type=service

# List all the inactive systemd services
systemctl list-units --all --type=service --state=inactive

# List all the installed systemd services
systemctl list-unit-files --type=service

# List all systemd services that will be run at each boot automatically
systemctl list-unit-files --type=service --state=enabled

關機與開機

# Halt the system
systemctl halt

# Poeroff the system
systemctl poweroff

# Reboot the system
systemctl reboot

其他附屬指令

coredumpctl
# 列出系統所有 core dump
coredumpctl

# 列出指定 program 的 core dump
coredumpctl dump <program-name>

# 列出指定 PID
coredumpctl dump _PID=XXX

# 分析特定 core dump 的內容
coredumpctl gdb <PID>

# 預設 core dump files 路徑
/var/lib/systemd/coredump

CentOS 7 Tips

Post-Tasks to Minimal Install

Yum

系統更新

yum repolist enabled

查詢所有可更新的套件
yum list updates

更新所有套件
yum update --disablerepo=epel

停用有問題的 yum-updatesd,並以下列方式取代

停用 yum-updatesd
service yum-updatesd stop
chkconfig yum-updatesd off

新增 /etc/cron.daily/yum.cron
#!/bin/sh
/usr/bin/yum -R 120 -e 0 -d 0 -y update yum
/usr/bin/yum -R 10 -e 0 -d 0 -y update                        #如果不想讓系統自動更新所有套件,可註解這行。

chmod 0755 /etc/cron.daily/yum.cron 

各種舊版本的套件庫位址

http://vault.centos.org/

如果想將多個 CD 的 ISO 檔合併成一個 DVD ISO,可以使用附件區的 mkdvdiso.sh,這只能使用在 RedHat/CentOS 版本,使用方法如下:

yum install anaconda-runtime mkisofs

./mkdvdiso.sh cd/ /tmp/CentOS-5.5-i386-bin-DVD.iso

TIPs:

所有 CD ISO 檔放在 cd/ 目錄內

必須關閉 SELinux

輸出檔路徑必須是絕對路徑

清除最新套件庫清單及暫存的套件檔

yum clean all

搜尋特定檔案名稱屬於哪個套件
搜尋 libstdc++.so.6

yum whatprovides "*/libstdc++.so.6" 

列出指定套件的相依性

yum deplist <package-name>

repoquery --requires <package-name>

下載 RPM 套件

yum -y install yum-utils.noarch
yumdownloader <package-name>

; Extract downloaded RPM
rpm2cpio dekiwiki-10.0.1-3.1.noarch.rpm | cpio -idmv 

yum -y install --downloadonly --downloaddir=/tmp/packages NetworkManager

安裝時臨時啟用一個不常用的套件庫位址

yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel

使用光碟 ISO方式來升級系統

# vi /etc/yum.repo.d/CentOS-Media.repo

[c6-local]
name=CentOS-$releasever - Media
baseurl=file:///mnt/iso/
gpgcheck=0
enabled=0

NOTE: enabled=0,不是 1。將 DVD 掛載為 /mnt/iso。 

# yum --disablerepo=\* --enablerepo=c6-local upgrade

安裝本機端的 RPM 套件

yum --nogpgcheck install htop-1.0.2-1.el5.rf.x86_64.rpm

安裝指定版本套件

yum --showduplicates list <package-name>
yum list <package-name>-<version>
yum install <package-name>-<version> 

列出所有套件庫位址

yum repolist
yum repolist enabled 

列出已安裝套件

yum list installed
yum list installed |tail -n +3|cut -d' ' -f1 > installed_packages.lst
或
rpm -qa > installed_packages.lst

yum -y install $(cat installed_packages.lst) 

安裝 EPEL 套件庫
EPEL - Extra Packages for Enterprise Linux

rpm -ivh http://mirror01.idc.hinet.net/EPEL/5/i386/epel-release-5-4.noarch.rpm
rpm -ivh http://mirror01.idc.hinet.net/EPEL/6/i386/epel-release-6-8.noarch.rpm 

TIPs:

錯誤: Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
解決: sed -i "s/mirrorlist=https/mirrorlist=http/" /etc/yum.repos.d/epel.repo

安裝 ELRepo 套件庫
ELRepo - The Community Enterprise Linux Repository

rpm --import http://elrepo.org/RPM-GPG-KEY-elrepo.org

for RHEL-5, CENTOS-5
rpm -Uvh http://elrepo.org/elrepo-release-5-2.el5.elrepo.noarch.rpm

for RHEL-6, CENTOS-6
rpm -Uvh http://elrepo.org/elrepo-release-6-3.el6.elrepo.noarch.rpm

安裝 RPMforge/RepoForge 套件庫
RPMforge 是由 Dag 及其他包裝者合作維護的。他們為 CentOS 提供超過 5000 個套件,包括 wine、vlc、mplayer、xmms-mp3 及其他受歡迎的媒體工具。它並不是 Red Hat 或 CentOS 的一部份,但卻是為那些發行版本而設計的。

http://repoforge.org/use/

CentOS 如何補安裝套件組
系統在第一次安裝時,都可以選擇要安裝哪些套件組,假使之後系統要補裝某套件組,例如 GNOME 視窗套件,可以使用這些指令,而不用一一找出有哪些相依性的套件名稱。

列出有哪些套件組可安裝
# yum grouplist
安裝 GNOME 視窗套件組
# yum groupinstall "GNOME Desktop Environment"
移除套件組
# yum groupremove "Office Suite and Productivity" "Dial-up Networking Support"

設定 proxy
編輯 /etc/yum.conf

proxy=http://<username>:<password>@<this.is.proxy.ip:<port>/
proxy=http://windowsad\username:password@proxy.server:port/

安裝本機上的 RPM

# yum localinstall my.rpm
建立 YUM 套件庫主機

安裝套件 createrepo
CetOS 5:

createrepo /source/path/reas5
createrepo -g  /source/path/reas5/repodata/comps.xml

CetOS 6/7:

 createrepo /yum-repo-packages/centos_6.4_x86_64
 createrepo -g /yum-repo-packages/centos_6.4_x86_64/repodata/2727...cab6f72-c6-x86_64-comps.xml /yum-repo-packages/centos_6.4_x86_64

 

 

 

 

 

ssh

連接遠端主機的設定參數
$ ssh -F ~/.ssh/config -G remote-host-name
user root
hostname 173.82.136.138
port 22
addressfamily any
batchmode no
canonicalizefallbacklocal yes
canonicalizehostname false
challengeresponseauthentication yes
checkhostip yes
compression no
...
複製主機 A 的公鑰檔 id_rsa.pub 至遠端主機上

指令一:從主機 A 上執行

ssh-copy-id user@remote-host-ip 
or
ssh-copy-id -f -i $HOME/.ssh/id_rsa.pub user@remote-host-ip

指令二:從主機 A 上執行

cat ~/.ssh/id_rsa.pub | ssh user@remote-host-ip "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"

從主機 B 上執行,以手動方式複製:

cd ~/.ssh
mv id_rsa.pub host-A-hostname.pub
cat host-A-hostname.pub >> authorized_keys
chmod 0700 ~/.ssh
chmod 0640 authorized_keys

NOTE:

如果 .ssh 目錄裡已經有 authorized_keys 檔案,可以另存一個檔名加上 2,例如 authorized_keys2

測試連線: 從主機 A 上執行

ssh <remote-userB>@<remote-hostB-name>

不需要輸入密碼就可以登入。

FirewallD

Introduction

FirewallD is frontend controller for iptables used to implement persistent network traffic rules. It provides command line and graphical interfaces and is available in the repositories of most Linux distributions. Working with FirewallD has two main differences compared to directly controlling iptables:

  1. FirewallD uses zones and services instead of chain and rules.
  2. It manages rulesets dynamically, allowing updates without breaking existing sessions and connections.

FirewallD is a wrapper for iptables to allow easier management of iptables rules–it is not an iptables replacement. While iptables commands are still available to FirewallD, it’s recommended to use only FirewallD commands with FirewallD.

Tutorials

系統帳號管理

教學連結
建立系統用帳號

CentOS/RedHat)

groupadd -r asterisk
useradd -r -g asterisk -d /var/lib/asterisk -M asterisk

Ubuntu/Debian)

addgroup --system asterisk
adduser --system --ingroup asterisk --home /var/lib/asterisk --no-create-home --shell /bin/bash asterisk
強制修改密碼

強迫使用者在第一次登入後,修改他們的登入密碼

# 先將帳號鎖定
usermod -L <username>

# 強制第一次登入必須修改密碼
chage -d 0 <username>

# 解除帳號鎖定
usermod -U <username>

# 檢查帳號的期限
chage -l <user-name>
帳號使用期限
# 檢查帳號期限
chage -l <user-name>

# 設定有效期限 
chage -M 10 <user-name>             # 10 天後密碼即失效
chage -E "2017-02-20" <user-name>   # 2017-02-20 以後帳號即鎖定
chage -I 10 <user-name>             # 如有設定密碼期限時,當密碼失效啟 10 日後自動鎖定帳號 

# 解除期限
chage -E -1 <user-name>       ; 數字 -1 解除期限設定 
帳號鎖定與解鎖
# 鎖定帳號
usermod -L <user-name>
passwd -l <user-name>
chage -E 0 <user-name>

# 解鎖帳號
usermod -U <user-name>
passwd -u <user-name>
chage -E <user-name>

# 檢查帳號鎖定狀態
grep <user-name> /etc/shadow

dbtest:!$6$hFCW6eI1$kI9J9QrxCjnpvzFPJnxSpNvQ...  密碼欄有 ! 符號表示鎖定

TIPs:
注意:passwd 雖然可以鎖定帳號,但仍可以用 SSH-Key 登入。

修改既有帳號的設定

修改帳號的註解 Comment

usermod -c "John" john
usermod -s "/sbin/nologin" alang
限制某帳號不可遠端登入

但可以由其他允許帳號從遠端登入後,執行 su 切換到該帳號

情境:限制 devrpt 可以從遠端登入,但其他帳號在登入後可以 su 到 devrpt。

方法一: 修改 sshd_config

# Added by Alang
# prevent certain users from using ssh for login
# while retaining the option to 'su username'
#
DenyUsers istdc

方法二: 最快速且容易設定但不適用需要有密碼的帳號

# 刪除 devrpt 的密碼
passwd -d devrpt

方法三: 比較嚴謹的做法

以 CentOS 為例:

1. 編輯 /etc/security/access.conf,加上這幾行

# The line 'cron crond' is required
+:devrpt:cron crond tty1 tty2 tty3 tty4 tty5 tty6
-:devrpt:ALL

TIPs:
內容格式為 permission : username: origins

permission + 允許 或 - 拒絕
username 帳號
origins 來源,這可以是 tty 名稱'、主機/網域名稱、IP 。

注意:在此例,必須加上 cron crond 這一行,否則該帳號的 crontab 會無法工作。

2. 對於不同的登入服務,需要修改相應的安全設定檔

視需要將以下內容加入其中一項或多項檔案內

# Limited users for remote login via telnet
# Check the file /etc/security/access.conf
account    required     pam_access.so
重建帳號的家目錄
mkhomedir_helper <username>
限制登入後的行為

情境: 帳號執行遠端登入後,只能變更密碼與幾個受限制的指令權限

RedHat-KB: https://access.redhat.com/solutions/65822

# Create the restricted shell
cp /bin/bash /bin/rbash

# Create a directory that is used as the HOME of the user
mkdir /home/dbuser/
mkdir /home/dbuser/bin

# Modify the target user for the shell as restricted shell
usermod -d /home/dbuser -s /bin/rbash siview
# or for new user
useradd -d /home/dbuser -s /bin/rbash siview

If a user uses rbash, the user can not do the following after login:

# Create specific profile for the user
vi /home/dbuser/.bash_profile

.bash_profile:

# cat /home/localuser/.bash_profile  
# .bash_profile  

# Get the aliases and functions  
if [ -f ~/.bashrc ]; then  
. ~/.bashrc  
fi  
# User specific environment and startup programs  
PATH=$HOME/bin  
export PATH
# Create the softlinks of commands which are required for the user
ln -s /bin/date /home/dbuser/bin/
ln -s /bin/ls /home/dbuser/bin/
ln -s /usr/bin/passwd /home/dbuser/bin/
密碼強度

預設強度:

 

 

Ubuntu and Debian

Ubuntu and Debian

APT

常用指令

dpkg
# 列出已安裝的套件
dpkg -l

# 列出指定套件的檔案列表
dpkg -L <package name>

# 查詢系統內某個指令檔的套件名稱
dpkg -S <path to command> 

# 查訊套件詳細資訊
dpkg -s <package name> 
apt-get
# 更新套件庫資訊
apt-get update

# 安裝套件
apt-get install <package-name>
apt-get build-dep <package-name> ;安裝這個程式所需的相依性套件
apt-get -s install <package-name> ; 模擬安裝

# 移除套件及相關不需要的相依性套件
apt-get autoremove <package-name>

# 移除單個套件
apt-get purge <package-name>

# 安裝本機套件
apt-get update
dpkg -i <package-name>.deb
NOTE: 如果出現缺少套件的資訊,再執行
apt-get -f install

# 檢視套件的 Changelog
apt-get changelog <package-name> 
apt-cache
apt-cache search <package-name>
apt-cache show <package-name>
apt-cache showpkg <package-name>

# 顯示套件的相依性
apt-cache depends <package-name>
其他指令
# 列出 GPG Key
apt-key list

# 避免套件被更新/升級
apt-mark hold glusterfs* 
設定 proxy 方式連接

方法一:

export http_proxy=http://username:password@proxy.server.net:port/
; 若是 Windows AD 帳號, 加上反斜線兩次
export http_proxy=http://addomain\\username:password@proxy.server.net:port/

方法二:編輯 /etc/apt/apt.conf,加上這幾行。

Acquire::http::proxy "http://192.168.1.1:3128/";
Acquire::https::proxy "https://192.168.1.1:3128/";
Acquire::ftp::proxy "ftp://192.168.1.1:3128/";
Acquire::socks::proxy "socks://192.168.1.1:3128/";
新增台灣鏡像主機
# Debian
deb http://ftp.isu.edu.tw/pub/Linux/Debian/debian/ lenny main contrib non-free
deb-src http://ftp.isu.edu.tw/pub/Linux/Debian/debian/ lenny main contrib non-free

# Ubuntu
deb http://tw.archive.ubuntu.com/ubuntu/ saucy main restricted
deb-src http://tw.archive.ubuntu.com/ubuntu/ saucy main restricted

如果 Repository 主機已經移除該版本,可以指向到這位址:old-releases.ubuntu.com

deb http://old-releases.ubuntu.com/ubuntu/ karmic main restricted
套件降級版本
# Search for the older version of the Firefox
apt-cache showpkg firefox

# Downgrade to the specified version
apt-get install firefox=59.0.2+build1-0ubuntu1

 

FAQ

Q: GPG error: http://apt.insynchq.com rosa InRelease: The following signatures were invalid: KEYEXPIRED 1473479811

Solution:

$> apt-key list | grep expired

pub   2048R/ACCAF35C 2012-09-10 [expired: 2016-09-10]

$> sudo apt-key adv --recv-keys --keyserver keys.gnupg.net ACCAF35C

# 移除 GPG Key
$> sudo apt-key del ACCAF35C 

Q: GPG error: http://repository.spotify.com testing InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A87FF9DF48BF1C90

Solution:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A87FF9DF48BF1C90

Q: The Key of OpenSUSE is expired

GPG error: http://download.opensuse.org/repositories/graphics:/darktable:/stable/xUbuntu_18.04  InRelease: 以下簽名無效: EXPKEYSIG 040524A84C70D8B5 graphics:darktable OBS Project <graphics:darktable@build.opensuse.org>
W: 無法取得 http://download.opensuse.org/repositories/graphics:/darktable:/stable/xUbuntu_18.04/InRelease,以下簽名無效: EXPKEYSIG 040524A84C70D8B5 graphics:darktable OBS Project <graphics:darktable@build.opensuse.org>

Solution:

$> apt-key list | grep -A 1 expired
$> apt-key list | grep -A 1 過期

Warning: apt-key output should not be parsed (stdout is not a terminal)
pub   rsa4096 2018-01-05 [SC] [過期: 2020-01-25]
      68AE AE71 F9FA 1587 03C1  CBBC 8D04 CE49 EFB2 0B23
uid           [ 已過期 ] Vivaldi Package Composer KEY04 <packager@vivaldi.com>

--
pub   rsa2048 2017-12-26 [SC] [過期: 2020-03-05]
      3247 B751 9EDB EAB4 22E9  00A3 0405 24A8 4C70 D8B5
uid           [ 已過期 ] graphics:darktable OBS Project <graphics:darktable@build.opensuse.org>

$> sudo apt-key del 4C70D8B5  #specify last 8 characters

$> wget -nv http://download.opensuse.org/repositories/graphics:/darktable:/stable/xUbuntu_18.04/Release.key -O Release.key
$> apt-key --keyring Release.key finger
$> sudo apt-key add - < Release.key