サーバ管理
 時刻の調整 ジョブの自動実行 ログを取る ユーザ管理 クライアント管理
 ネットワーク管理 SSH接続 ファイルの暗号化

ナレッジ

Snippet

コマンドライン ショートカット

Ctrl + a=行頭   e=行末
   b=戻←   f=進→
   u=戻切取← k=進切取→ y=貼付(ヤンク)
   h, BS=戻削除← d, DEL=進削除→ w=戻単語削除← 
Tab 1回=補完 2回=候補

RedHat系(CentOS、AlmaLinux、Amazon Linux 2023)

dnf check-update  # アップデート可能なRPMパッケージの有無確認
sudo dnf upgrade -y [個別RPMパッケージ]  # アップデートはupgrade(DaNdiFied yum)
sudo dnf install App_name  # RPMパッケージのインストール

Debian系(Ubuntu)

sudo apt update  # 最新のdebパッケージリスト
apt list --upgradable  # アップデート可能なdebパッケージの有無確認
sudo apt upgrade -y [個別debパッケージ]  # アップデートはupgrade
sudo apt install App_name  # debパッケージのインストール

## vim
# インストール
sudo apt install -y vim
# デフォルトのエディタをvimに変更
sudo update-alternatives --config editor

## OneDriveと同期
# パッケージのダウンロード
wget -qO - https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_22.04/Release.key | gpg --dearmor | sudo tee /usr/share/keyrings/obs-onedrive.gpg > /dev/null
# onedriveのソースリストに書き込み(確認の為teeで標準出力にも出力している)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/obs-onedrive.gpg] https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_22.04/ ./" | sudo tee /etc/apt/sources.list.d/onedrive.list

WSL2

# 「:Zone.Identifier」を一括削除する
find ./ -type f -name '*:Zone.Identifier' -exec rm {} \;

パッケージ系

# パッケージのダウンロード
wget https://path/***.tar.gz

# パッケージの解凍
tar -xzf ***.tar.gz  # 解凍後は.tar.gzを消す


# Chromeが立ち上がらない時(ERROR:process_singleton_posix.cc)
ls -l ~/.config/google-chrome  # SingletonLockがあるはず
rm ~/.config/google-chrome/SingletonLock

本体設定 確認・変更系コマンド

# 自PC情報
hostnamectl  # 自PCの情報色々
hostname  # ホスト名のみ
cat /etc/hostname  # 同じくホスト名のみ

# ホスト名の変更
sudo hostnamectl set-hostname [new-hostname]


# ディストリビューションのバージョン確認
cat /etc/os-release  # RHEL,Debian共通
cat /etc/lsb-release  # Debian

# Linuxカーネルのバージョンチェック
uname -r
5.15.146.1-microsoft-standard-WSL2

# /直下の階層構造に関するマニュアル
man hier  # HIER(7)  # manual hierarchy  # CONFORMING TO the Filesystem Hierarchy Standard(FHS)

# ホームディレクトリのフォルダ名を日本語から英語に変更する
LANG=C xdg-user-dirs-gtk-update

# 日本語化、英語化
localectl
sudo localectl set-locale LANG=ja_JP.UTF-8
sudo localectl set-locale LANG=en_US.UTF-8

# 時刻、タイムゾーン
timedatectl
date
ls /usr/share/zoneinfo
sudo timedatectl set-timezone Asia/Tokyo
sudo timedatectl set-timezone UTC


# ログインシェルの確認
echo $SHELL  # environmental variables '$SHELL'
 /bin/bash  # born-again shell

# デフォルトパーミッション
umask  # 確認
umask 0022 or 022  # 設定


# シェル変数
var_name=***  # 設定
set | grep ***  # 確認
unset var_name  # 消去

# 環境変数
export -p  # 確認
printenv  # 確認
export var_name(=***)  # 設定
export -n var_name  # 消去


# ドライブの空き容量確認
df -h --total

# フォルダ使用量の確認
du -sh ~/Onedrive  # -s 付加で合計のみ表示
du -h ~/snap  # 全フォルダ表示

本体 監視系コマンド

$ man コマンド名  # マニュアル閲覧
$ tree  # 階層表示

$ ps -all  # 全プロセス確認



# システムの連続稼働時間の確認
uptime
 15:31:13 up  5:13,  1 user,  load average: 0.00, 0.00, 0.00

# ディスク使用量の確認
df -h --total   # dick free  # -hオプションを付けると、K M 等のSI表示になって読みやすい
 Filesystem      Size  Used Avail Use% Mounted on
 devtmpfs        4.0M     0  4.0M   0% /dev
 tmpfs           475M     0  475M   0% /dev/shm

# ディレクトリのディスク使用量の確認
du -h /var/www/html/blog  # disk usage
 3.2M    /var/www/html/blog/wp-admin/includes
 648K    /var/www/html/blog/wp-admin/images
 8.0K    /var/www/html/blog/wp-admin/maint

## ディレクトリとファイルのディスク使用量の確認
du -ah /var/www/html/blog | more  # -a ファイル含め全表示  # | more 1ページで止まる

## 指定したディレクトリのみのディスク使用量の確認
du -sh /var/www/html/blog
 81M     /var/www/html/blog

# メモリの使用状況を確認
free  # KB表示
                 total        used        free      shared  buff/cache   available
  Mem:          972340      294032      207456       34476      470852      488872
  Swap:              0           0           0
free -m  # MB表示
                 total        used        free      shared  buff/cache   available
  Mem:             949         287         202          33         459         477
  Swap:              0           0           0
free -ms 1  # 更新時間を1秒にする
  Mem:  仮想サーバのメモリ
  Swap: スワップ領域(仮想メモリ)

## y を死ぬほど増殖させてCPU使用率を≒100%まで負荷をかける(テスト用)
yes > /dev/null &  # yが表示されないよう/dev/nullに捨てる をバックグラウンドで実行

## プロセスを終了する
kill [PID]  # 指定したプロセスIDを強制終了する yesを止める時とかw

# CPUやメモリの使用状況を確認
top
 top - 18:06:09 up  7:48,  1 user,  load average: 0.00, 0.00, 0.00
 Tasks: 111 total,   1 running, 110 sleeping,   0 stopped,   0 zombie
 %Cpu(s):  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
 MiB Mem :    949.6 total,    202.4 free,    287.1 used,    460.1 buff/cache
 MiB Swap:      0.0 total,      0.0 free,      0.0 used.    477.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  170984  16696  10072 S   0.0   1.7   0:05.54 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
top -u apache  # "apache"というユーザについてだけ表示
top -n 2  # 2回更新して終了
top -d 5  # 5秒間隔で表示

# システムの負荷状況を確認
vmstat  # Virtual Memory Statistics
  procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
   r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
   0  0      0 207216   1108 470296    0    0    11    39   47  127  0  0 100  0  0
vmstat 1  # 1秒ごとに更新される
vmstat 1 5  # 1秒ごとに5回更新すると終了
vmstat -SM   # MB表示になって見やすくなる
  vmstat: -S requires k, K, m or M (default is KiB)
  procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
   r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
   1  0      0    202      1    459    0    0    11    38   47  127  0  0 100  0  0

# 実行中のプロセスの確認
ps
      PID TTY          TIME CMD
    22717 pts/1    00:00:00 bash
    24002 pts/1    00:00:00 ps
ps aux | more  # a:全ユーザ  u:CPU/MEMORY  x:現在実行中のプロセス
    USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root           1  0.0  1.7 170984 16696 ?        Ss   10:17   0:05 /usr/lib/systemd/systemd --switched-root --system --d eserialize=32
    root           2  0.0  0.0      0     0 ?        S    10:17   0:00 [kthreadd]
    root           3  0.0  0.0      0     0 ?        I<   10:17   0:00 [rcu_gp]
    --More--

ネットワーク 監視系

networkctl status  # 自PCのIPアドレス情報
ifconfig  # NWインターフェース確認、設定

ping -c 回数 [destination]  # 56(84) bytes of data
traceroute  # 30 hops max, 60 byte packets
tracepath  # pmtu

dig <domain>  # DNS登録情報
host <domain>  # DNS登録情報
nslookup <domain|addr> # ドメイン/GIPの正引き/逆引き

route  # ルーティングテーブル確認、設定 -net NWaddr / -host HOSTaddr
ss  # ローカルホストのネットワーク関連情報確認(netstatは古いので非推奨)


nc -l 8000 < response.txt  # 簡易的に疑似サーバを建て8000番ポートでlisten(-l)状態に
nc PCname 8000  # 別シェル/別PCから疑似サーバに接続試験


curlコマンド

# HTTPレスポンスヘッダを取得
curl -I https://www.schneehoppli.com

# コンテンツ取得時の詳細なログを表示する
curl -v https://www.schneehoppli.com

ユーザ・グループ 管理系コマンド

# ユーザ一覧
cat /etc/passwd | grep /bin/bash  # retrieve from store path

# ユーザ表示
users  # current login user name only
who  # current login user name only

# ユーザ情報
id  # current user information (uid=, gid=, groups=)
id masa  # specific user information


# -mでユーザ追加した時の/home/***ディレクトリのデフォルト設定
ls -lha /etc/skel

# ユーザ追加
sudo useradd -m masaoji  # create a general user named "masa"
 cat /etc/passwd  # make sure the information of all resistered users

# ユーザパスワード変更
sudo passwd masaoji  # set password to user "masa"

# ユーザを削除する
sudo userdel -r masaoji  # delete user named "masa"  # --recursive(also delete user's home directory)


# 別ユーザでログインする
su - username  # switch user ( - : cd dest user home)


# スーパーユーザ権限を編集
sudo EDITOR=vim visudo  # add Administrator's permission to user named "masa"
 ## Allow root to run any commands anywhere <- append to this area
 root    ALL=(ALL)    ALL
 masa    ALL=(ALL)    ALL


# グループ作成
sudo groupadd grpname

# グループ全体確認
cat /etc/group  # make sure the setting of all groups
 ec2-user:x:1000:  # uname:passwd:gid
 masa:x:1001:
cat /etc/group | grep **  # narrow down by specific letter

# 自分の所属グループを確認
groups
 ec2-user adm wheel apache systemd-journal

# 特定ユーザの所属グループを確認
groups masa  # make sure groups that user belongs to
 masa : masa wheel

## ユーザ情報でも所属グループが確認できる
id  # current user information (uid=, gid=, groups=)
id masa  # specific user information

# グループにユーザを追加する
sudo usermod -aG wheel masa  # --add --Group  # wheel = 特権を持つグループ

# グループからユーザを削除する
sudo gpasswd -d masa grpname  # Removing user ** from group **

# グループを削除する
sudo groupdel grpname

頻出 基本コマンド

# 検索
find . -name '*' -exec コマンド +  (+のほうが\;より速いらしい)
find . -type d/f  # ディレクトリ/ファイル

# ファイル内文字検索
grep 文字列 ファイル名
cat ファイル名 | grep 文字列

# カレントディレクトリ
pwd  # print working directory

# ディレクトリ移動
cd (~)  # change directory (change current directory) to home directory(tilde expansion)
cd -  # change directory to previous directory (-minus)

# リスト
ls -ilha1 (ll)  # list  # -i-node
 type permission  owner  group       last modified
 drwxr-xr-x. 2 ec2-user ec2-user   6 May 28 10:18 lesson
  - : file           r : readable
  d : directory      w : writable
  l : symbolic link  x : executable
                     - : no authority
ls -F  # --classiFy  # file type  name=file   name/=directory   name@=symbolic link  name*=excutable file
ls -a  # --all  # show all
ls -l  # --long  # perm, num of file(in dir), owner, ownergrp, file size, last modified, file/dir name
ls -w30  # --width=30  # set display width

# ディレクトリ作成・削除
mkdir dirname  # make "lesson" directory in current directory
mkdir -p dir2/dir3  # --parent★  # make multiple directories (both relative path / absolute path are makable)
rmdir  # remove directory  # directory must be empty!
rm -r  # remove directory  # --recursive(再帰的)

# ファイル作成・削除
touch filename  # create file | update timestamp for existed file
touch file{1..10}  # Brace Expansion
rm filename  # remove hardlink->file
rm file*
 {} # Brace Expansion
 *  # Pass-name Expansion
 ?  # one letter
 ?? # two letters
 \  # ignore one letter
 '' # ignore letters
 "" # ignore letters except ! $ ` <- will be expanded


# ファイル・フォルダ権限変更
chmod 400 file  # change mode  # add 400 permission to file
chmod -R 775 dir/  # add 775 permission --recursively to all files&directories under dir/ 
r : 4
w : 2
x : 1

## 4桁目
4 : SUID  dirに設定すると配下に作ったdir/fileは一般ユーザでも所有者と同じ権限で実行できる
2 : SGID  dirに設定すると配下に作ったdir/fileは一般ユーザでも所有者グループと同じ権限で実行できる
1 : Sticky bit  所有者以外削除はできないが、誰でも書き込めるようになる



# ファイル・フォルダ所有者変更
sudo chown masa:masa dir/file  # change the dir/file's owner:owngroup to masa:masa
sudo chown -R masa:masa dir  # change recursively the owner:owngroup under dir/ to masa:masa


# ハードリンク、シンボリックリンク作成
ln src_file dest_file  # hard link (same i-node#) ## can't link to directory
ln -s src_file/dir dest_file/dir  # symbolic link ## can also link to directory


# 内容確認
cat file  # catenate/concatenate
less file  # scroll display by Spacekey/j/Enter/k/q
         ↓j  ↑k    /search = n:next  N:prev 
od  # show as binary (for example /bin/bash)


# ダミーファイルを作成
dd if=/dev/zero of=ファイル名 bs=500KB count=2)  # 1MBサイズの空っぽファイルを作成

# コピー
cp src_file dest_file  # copy file
cp src_file1 src_file2 dest_dir  # copy 2 files into dest_dir
cp -r src_dir/ dest_dir/  # copy dir  # --recursive

# 移動、リネーム
mv src_path/name dest_path/rename  # move&rename file/directory


# ssh接続
ssh -i keypair.pem user@IPaddress

# scp移動
scp -i keypair.pem [src dir/file] user@GIP:[dir]  # EC2にファイル移動
scp -i keypair.pem -r [src dir] user@GIP:[dir]  # EC2にディレクトリ丸ごと移動


# 圧縮  # 先に圧縮後のファイル名を書くのを間違えずに!
zip ***.zip 対象file
zip -r ***.zip 対象dir  # zipコマンドは、-rを指定しないと再帰的に圧縮してくれないToT
tar -zcvf ***.tar.zip 対象dir/file  # tarは、デフォルトでディレクトリを再帰的に圧縮してくれるので-rコマンドは無い

# 解凍
unzip 対象.zip  # zip用
tar -zxvf 対象.tar.gz -C dir --strip-components 1  # tar用
  -z : gzipで圧縮されたアーカイブを扱う
  -x : アーカイブを解凍
  -v : 解凍の進行状況を詳細に表示
  -f : 操作するアーカイブ名を指定する
  -C : 解凍したファイルをdirに移動する
  --strip-components 1 : 解凍する時にアーカイブの最上位ディレクトリを無視する
   これにより、アーカイブ内のすべてのファイルとディレクトリが直接dir内に展開される
unar 対象圧縮ファイル  # Debian系のみ! 一番簡単 .zipも.tar.gzもいける


# 出力
echo  # output to standard-output
echo *** > filename  # create file and output ***
grep ^a a$ < file > file2



# コマンド履歴
history 10  # display latest 10 history
!23  # execute 23th history command
history | grep ls  # show history list including "ls"
history -d 23  # --delete history no.23


# コマンド実行ファイルの在り処(フルパス)
which command_name  # search command's full path

# コマンドのマニュアル
man command_name  # show command's manual
command --help  # show command's help

# 画面のクリア
clear  # clear screen
Ctrl+l でもできる

# ログアウト(ターミナルから抜ける)
exit  # quit from terminal

Vim ノーマルモード ショートカット / コマンド

gg  # 一番上に
G   # 一番下に

★ショートカット
cw  # 単語を消す

★コマンド
:wq!  保存・終了・強制
/  検索


サーバ管理

時刻の調整

タイムゾーンの確認と設定

# タイムゾーンの確認
$$ timedatectl (status)
               Local time: Tue 2024-02-27 14:54:25 JST
           Universal time: Tue 2024-02-27 05:54:25 UTC
                 RTC time: Tue 2024-02-27 05:54:25
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: n/a
          RTC in local TZ: no

# タイムゾーン一覧
$ timedatectl list-timezones
$ tzselect  # インタラクティブ

# タイムゾーンの設定
$ timedatectl set-timezones
$ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# 廃止済み /etc/localtime と /etc/timezone ファイルをまとめて設定できたらしい
$ tzconfig
WARNING: the tzconfig command is deprecated, please use:
 dpkg-reconfigure tzdata

時刻の確認

# システムクロック
$ date
Tue Feb 27 11:45:48 JST 2024
$ date +%Y/%m/%d-%H:%M # 形式指定 +以降はスペース不可
2024/02/27-11:45
$ timedatectl (status) # でもわかる

# ハードウェアクロック
$ sudo hwclock (-r)
2024-02-27 11:45:47.987558+09:00

# カレンダー
$ cal
   February 2024
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29

時刻の設定

# ハードウェアクロック&システムクロックを一度に設定
$ timedatectl set-time "2024-02-27 15:00:00"

# システムクロック設定
$ date 022715002024.00  # 2024年02月27日15時00分00秒

# NTPラウンドロビンで時刻同期
$ ntpdate pool.ntp.org
27 Feb 15:30:15 ntpdate[121672]: step time server 133.243.238.243 offset +1.488017 sec

# NTPサーバ同期の有効|無効
$ timedatectl set-ntp yes | no

# ハードウェアクロックからシステムクロックに時刻を反映
$ sudo hwclock --hctosys
$ sudo hwclock -s

# システムクロックからハードウェアクロックに時刻を反映
$ sudo hwclock --systohc
$ sudo hwclock -w

ジョブの自動実行

cron

 指定日時にジョブの自動実行を行うジョブスケジューラ。デーモン名は crond
 システム用とユーザ用、2種類の設定ファイル(crontab)がある。 ★先輩の知恵


/etc/crontab を viで直接編集

システム用 crontabファイル
1行1コマンド。実行ユーザを指定する必要あり。

# 書式: [分] [時] [日] [月] [曜日] [実行ユーザ名] [コマンド]
$ cat /etc/crontab
SHELL=/bin/sh

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  17 *  *  *  *   root    cd / && run-parts --report /etc/cron.hourly
  25 6  *  *  *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
  47 6  *  *  7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
  52 6  1  *  *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
  20 15 *  *  3   root    find / -perm -u+s
  1. 「/etc/at.allow」ファイルがあれば、記述のあるユーザのみが利用可能
  2. 「/etc/at.allow」ファイルがなければ、「/etc/at.deny」を参照し、そこに記述のないユーザが利用可能
  3. 両方のファイルがなければ、rootユーザのみが利用可能

$ crontab コマンド

ユーザ用 crontabファイル
 $ crontab -e でcron登録しようとすると、環境変数EDITORのエディタが起動。

# 未登録の場合は [1]nano~[4]忘れた で選ぶことになり面倒なので環境変数登録しておく。
$ export EDITOR=vim
# 基本形
$ crontab -e, --edit    # /var/spool/cron/crontabs/username が作成される
$ crontab -l, --list    # cat /var/spool/cron/crontabs/username と同じ
$ crontab -r, --remove  # /var/spool/cron/crontabs/username が即消滅する
# 編集する時は、現cronを書き出して、バックアップを取りつつ、viで編集したものを読み込ませる方式が良いという説が。
$ crontab -l > my_crontab  # まず別ファイルに内容書き出し
$ cp -p my_crontab my_crontab_backup`+%Y%m%d%H%M`  # -pで属性全コピー
$ vi my_crontab  # 編集
$ crontab my_crontab  # 読み込んでcrontabに設定

$ atコマンド

$ sudo dnf/apt install at
1回だけ時間指定でjobを予約実行

$ at 22:00
 warning: commands will be executed using /bin/sh
 at Fri Feb 23 22:00:00 2024
at> touch ~/test/test.txt
at> <EOT>  # Ctrl+Dで終了
 job 1 at Fri Feb 23 22:00:00 2024

$ ls ~/test   # 21:59

$ ls ~/test  # 22:00
test.txt

$ batchコマンド

1回だけ負荷が下がった時にjobを実行するよう予約

$ batch
warning: commands will be executed using /bin/sh
at Sun Feb 25 22:11:00 2024
at> echo "IDLE" > /dev/pts/0
at> <EOT>
job 5 at Sun Feb 25 22:11:00 2024

$ at -l
5        Feb 25 22:11:00 2024

$ IDLE

/dev/pts/0とは何ぞや

/etc/anacrontab を viで直接編集

$ sudo dnf/apt install anacron
システム用 1日1回だけjobを予約実行

$ cat /etc/anacrontab
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45  # 分単位で整数で指定
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22  # 開始時刻-終了時刻

#period in days   delay in minutes   job-identifier   command
1   5   cron.daily      nice run-parts /etc/cron.daily
7   25  cron.weekly     nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly        nice run-parts /etc/cron.monthly

・実行履歴を管理しており、未実行のジョブを検出できる。
・デーモン化(バックグラウンド実行)しないため、定期的に実行する必要がある。主にcrondによって実行される。

ログを取る

設定ファイル    /etc/rsyslog.conf (reliable-syslog)
保存先ディレクトリ /var/log/syslog(デフォルト)
          /var/log/yourfilename

# 設定
$ sudo vi /etc/rsyslog.conf

# 記法  ファシリティ.プライオリティ;複数記述可 /保存先ログファイル
# (RHELのsyslog.conf例)
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* /var/log/maillog
cron.* /var/log/cron
*.emerg *
uucp,news.crit /var/log/spooler
local7.* /var/log/boot.log
# 設定例
auth.* /var/log/secure
*.info;mail.none;syslog.none -/var/log/messages # - :非同期書き込み
kern.=emerg /dev/console
*.* /dev/console
*.notice @192.168.100.101  # send to remotehost by UDP

# rsyslog再起動
$ /etc/init.d/rsyslog restart

# log確認
$ less /var/log/syslog | grep xx
$ cat /var/log/yourfilename | grep xx

ログローテーションの設定

$ less /etc/logrotate.conf

$ logrotate

ログの一元管理

保存先ディレクトリ /var/log/journal
 ※ 存在しない場合は /run/log/journal

systemd-journaldのジャーナルファイルに書き込む

# 指定したコマンドの実行結果
$ systemd-cat コマンド名

# 手動でログメッセージを生成
$ logger Message

systemd-journaldのログ表示

$ journalctl

ユーザ管理

root権限の管理

 sudo 参照先 /etc/sudoers

# 一般ユーザーが、自分に権限委譲されているコマンドを調べる
$ sudo -l
Matching Defaults entries for username on
    PCname:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User username may run the following commands on
        PCname:
    (ALL : ALL) ALL

一般ユーザ権限の管理

対話的ログインを禁止する
 恒久的 usermod -s 参照先 /etc/passwd
 一時的 /etc/nologinファイルを作成

※メールサーバやFTPサーバなど、ユーザアカウントは必要 でも ユーザがシステムにログインしシェルを利用する必要が無い。そのような時は対話的ログインを禁止(下記 禁止例3 が参考になる)

$ cat /etc/passwd  # 通常のログイン可能な状態
root:x:0:0:root:/root:/bin/bash
(中略)
user1:x:1000:1000:,,,:/home/user1:/bin/bash
user2:x:1000:1000:,,,:/home/user2:/bin/bash

#禁止例1:既存ユーザ usermod -s コマンドで権限変更
$ sudo usermod -s /bin/false user2
$ cat /etc/passwd
user2:x:1000:1000:,,,:/home/user2:/bin/false

# 禁止例2:既存ユーザ /etc/passwd のログインシェル箇所を直接編集
$ sudo vi /etc/passwd
user2:x:1000:1000:,,,:/home/user2:/bin/bash ← false に書き換え

# 禁止例3:新規ユーザ useradd -s コマンドで、ログイン禁止+/home/未作成で登録
$ sudo useradd -s /sbin/nologin user3
user3:x:1000:1000:,,,:/home/user3:/sbin/nologin

# 禁止例4:メンテ等で一時的に一般ユーザログイン禁止にする時(SUはログイン可能)
$ touch /etc/nologin  # ファイルが存在していればログイン禁止が有効となる

ユーザアカウント追加

$ useradd -D  # デフォルト値の確認
$ useradd -c username  # /home/usernameディレクトリ作成


アカウント毎にパスワード有効期限の設定 CHange passwd AGE

 chage 参照先 /etc/shadow

$ chage -M 30 username  # 最長(Max)60日で強制的にPW変更
$ chage -I 7 username  # PW有効期限切れ後、アカウントロック(Inactive)までの猶予日数
$ chage -E YYYY-MM-DD username  # アカウントの有効期限を指定

$ chage -l username  # <一般ユーザ権限で閲覧可>PW有効期限に関する情報を表示
Last password change                                    : Jan 16, 2024
Password expires                                        : never
Password inactive                                       : never
Account expires                                         : never
Minimum number of days between password change          : 0
Maximum number of days between password change          : 99999
Number of days of warning before password expires       : 7

ユーザやシェルが利用できるリソースの制限値の確認

$ ulimit -a
real-time non-blocking time  (microseconds, -R) unlimited
core file size              (blocks, -c) 0  #プログラム異常終了時に使用していたメモリ情報
data seg size               (kbytes, -d) unlimited
scheduling priority                 (-e) 0
file size                   (blocks, -f) unlimited
pending signals                     (-i) 63498
max locked memory           (kbytes, -l) 65536
max memory size             (kbytes, -m) unlimited
open files                          (-n) 1024
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) 63498
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited

# 制限値を変更(規制緩和はroot権限)
$ ulimit [オプション] [制限値]

ユーザログイン状況の管理

 w 参照先 /var/run/utmp
 last 参照先 /var/log/wtmp

# ログイン中のユーザ一覧
$ w
 23:28:17 up 10 min,  1 user,  load average: 0.04, 0.06, 0.01
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     pts/1    -                23:22    5:20   0.01s  0.01s -bash
$ who
user     pts/1        2024-02-28 23:22

# 最近ログインしたユーザの一覧を表示
$ last
user     pts/1                         Wed Feb 28 21:23   still logged in
reboot   system boot  5.15.133.1-micro Wed Feb 28 21:23   still running
user     pts/1                         Sat Feb 24 17:49 - crash (4+03:34)
reboot   system boot  5.15.133.1-micro Sat Feb 24 17:49   still running
user     pts/1                         Fri Feb 23 12:18 - crash (1+05:30)
user     pts/1                         Tue Jan 16 19:24 - crash  (10:06)
reboot   system boot  5.15.133.1-micro Tue Jan 16 19:24 - 15:59 (5+20:34)
root     pts/1                         Tue Jan 16 19:24 - crash  (00:00)
reboot   system boot  5.15.133.1-micro Tue Jan 16 19:24 - 15:59 (5+20:34)

# 指定した時間(秒数)、何も入力がなければ自動的にログアウトさせる環境変数
$ export TMOUT=600  # 600秒(5分間)の例
入力待ちがタイムアウトしました: 自動ログアウト

クライアント管理

ファイル権限の管理

# SUIDとSGIDの両方が設定されたファイルをすべて把握
$ find / -perm -6000  # -4000 と -2000 の両方に引っかかる rwsr-sr-x

# 

プロセスの管理

プロセスが開いているファイルを表示

$ lsof  # すべて
$ lsof -i:25  # 25番ポートを使っているプロセス
$ lsof ~/test  # 特定のファイルを開いているプロセス

プロセスを開いているユーザを特定、強制終了

$ fuser -u /bin/bash
/usr/bin/bash:         403e(username)   486e(username)

$ fuser -v /bin/bash
                     USER        PID ACCESS COMMAND
/usr/bin/bash:       username    403 ...e. bash
                     username    486 ...e. bash

# 外部からの特定ポートへの不正アクセスを強制終了
$ fuser -k -n tcp 65432

# 外部からの不正アクセスによるキー操作を強制終了
$ fuser -uk /tmp/.keylog

サービスの監視

利用頻度の低いサービスを監視(リクエストが来た場合にだけ該当サービスを実行)

 xinetd 設定ファイル /etc/xinetd.conf
    参照先 /etc/xinetd.d

$ cat /etc/xinetd.conf
defaults
{
# Please note that you need a log_type line to be able to use log_on_success
# and log_on_failure. The default is the following :
# log_type = SYSLOG daemon info
}
includedir /etc/xinetd.d

$ ls /etc/xinetd.d
chargen      daytime-udp  echo      services
chargen-udp  discard      echo-udp  time
daytime      discard-udp  servers   time-udp

# 独自サービス設定例
$ vi /etc/xinetd.d/myservice
service myservice
{
        disable         = no
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/local/bin/myservice
        server-args     = -debug
        only_from       = 192.168.1.0/24
        no_access       = 172.16.0.0/16
        log_type        = /var/log/myservice.log
}

・only_fromもno_accessも設定されていない場合、サービスへのアクセスは全て許可
・only_fromとno_accessが同時に指定された場合、より厳密にマッチするほうに従う

ネットワーク管理

ファイアウォールの設定

デフォルトゾーン(9種類)
 public=公共領域での利用(デフォルト) work=業務での利用 home=家庭での利用
 internal=FW内部NW側での利用 external=FW外部NW側での利用
 dmz=非武装地帯での利用 block=パケット拒否 drop=パケット破棄 trusted=全て許可

$ firewall-cmd --get-default-zone  # デフォルトゾーン
public

$ sudo firewall-cmd --list-all  # 全設定
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

# サービスに追加(firewalldリスタートで設定消える)
$ sudo firewall-cmd --zone=public --add-service=xxx

# firewalldリスタート
$ sudo systemctl restart firewalld

ルーティングテーブルの管理

$ route(-F) # ルートテーブル表示(-Fはあってもなくても同じ)
$ route -C  # ルーティングキャッシュを表示
$ route -n  # 名前解決せずにルートテーブル表示(結果的に表示が速い)

$ netstat     # 有効なNW接続や、開いているソケットの情報を表示
$ netstat -i  # NWインターフェースの統計情報を表示
$ netstat -r  # ルートテーブル表示
$ netstat -rn # 名前解決せずにルートテーブル表示(結果的に表示が速い)

遠隔ホストのポートスキャン

$ nmap example.com.hoge / ipv4addr
Starting Nmap 7.80 ( https://nmap.org ) at 2024-02-28 22:57 JST
Stats: 0:00:04 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan
Connect Scan Timing: About 5.55% done; ETC: 22:58 (0:01:08 remaining)
Nmap scan report for example.com (118.xxx.xxx.xxx)
Host is up (0.047s latency).
rDNS record for 118.xxx.xxx.xxx: www.abcdef.ne.jp
Not shown: 993 filtered ports
PORT      STATE  SERVICE
21/tcp    open   ftp
80/tcp    open   http
443/tcp   open   https
8022/tcp  open   oa-system
65000/tcp closed unknown
65129/tcp closed unknown
65389/tcp closed unknown

SSH接続(公開鍵)

Phase1:ホスト認証(初回SSH接続のみ)

意義:クライアントが、接続先サーバが正当なサーバーであることを最初に確認する。
欠如すると:他のサーバからの偽装攻撃(中間者攻撃等)に対して脆弱になる為、セキュリティ上のリスクがある。

★事前にサーバ側でkeypairを作成し、.pemファイル(初回接続用)をクライアントPCにDLしておくこと
 ※conohaの.pemはed25519で作成されている

# クライアント側
$ cd  # .pemをDLしたディレクトリに移動しておく
$ ssh username@example.com -p 8022 -i keypair.pem

The authenticity of host '[example.com]:8022 ([118.xxx.xxx.xxx]:8022)' can't be established.
ED25519 key fingerprint is SHA256:XXXFDDbNXXXXZX+XiApVtXAHGFXXXXXXSL+XWPSMXXoX
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Warning: Permanently added '[example.com]:8022' (ED25519) to the list of known hosts.
Connection closed by 118.xxx.xxx.xxx port 8022

Phase2:ユーザ認証

意義:サーバが、接続希望ユーザが正当なユーザであることを確認する。

# クライアント側:ユーザ認証(ログイン)用 key pair 作成
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):パスフレーズ
Enter same passphrase again:パスフレーズ
Your identification has been saved in /home/username/.ssh/id_rsa
Your public key has been saved in /home/username/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:XOjXFqNqXXXVuXpvQXXKqJXXXX9bXdtXXXtratXXIrvQ username@PCname
The key's randomart image is:
+---[RSA 3072]----+
|+ o .    o.oooEo |
+----[SHA256]-----+

# クライアント側:公開鍵をサーバに渡す準備
$ cat id_rsa.pub
ssh-rsa AAAAxxxxxxxx... <- 公開鍵をコピー
   ↓
# サーバ側:公開鍵を登録
$ vi /home/username/.ssh/authorized_keys <- 公開鍵をペースト

# ログイン(ユーザ認証)
$ ssh username@example.com -p 8022  # 2回目以降 -i keypair.pem は不要

SSH関連 ディレクトリ構造

接続元:クライアント側

/
├ etc
│  ├ ssh
│    ├ ssh.config
│
│
├ home
   ├ username
     ├ .ssh
        ├ known_hosts
        ├ id_rsa  # ユーザ認証(ログイン)用
        ├ id_rsa.pub  # サーバに渡す用

接続先:サーバ側

/
├ etc
│  ├ ssh
│    ├ sshd.config
│    ├ ssh_host_rsa_key  # OpenSSHホスト認証(初回接続)用
│    ├ ssh_host_rsa_key.pub  # OpenSSHクライアントに渡す用
├ home
   ├ username
     ├ .ssh  # perm:700に設定
        ├ authorized_keys  # perm:600に設定

/etc/ssh/ssh_config クライアント側 設定ファイル

# 


/etc/ssh/sshd_config サーバ側 設定ファイル

# cat /etc/ssh/sshd_config
Protocol 2  # SSHのバージョンを指定
PermitRotLohgin no  # rootのログインを許可するか noを推奨
PubkeyAuthentication yes  # 公開鍵認証を行うか
AuthorizedKeysFile .ssh/authorized_keys  # 認証鍵リストの場所

ssh-agent

 メモリ上に秘密鍵を保管しておく認証エージェント
 bashオプションで新たなシェルを起動し、ssh-addやsshコマンドを実行する
 バックグラウンドで動作する

# ssh-agentを起動
$ ssh-agent bash
$ env | grep SSH  # 起動すると、環境変数が設定される
SSH_AGENT_PID=13501
SSH_AUTH_SOCK=/tmp/ssh-wP9xxxxxx/agent.135000


# ssh-agentに登録された秘密鍵の一覧を表示
$ ssh-add -l

# パスを聞かれずにログインする方法
$ ssh-add  # 秘密鍵を登録
Enter passphrase for /home/username/.ssh/id_rsa: パスフレーズを入力
Identity added:


# ssh-agentを終了(環境変数がkillされる)
$ ssh-agent -k

serverAを踏み台にしてserverBに接続

 SSH Agent Forwarding:ログイン先のサーバでもローカルホストの秘密鍵が使えるようになる

$ ssh -A user1@serverA
$ ssh -A user1@serverB

# DISPLAY環境変数が自動で設定される(接続先の画面が見られる)
$ ssh -X

トンネルを作る

 SSHポートフォワーディング:他の通信を自身の作成する暗号化コネクション内に流す機能

# Local port forwarding
$ ssh -L 8000:localhost:80 user@ssh-server

ファイルの暗号化

GnuPG(Gnu Privacy Guard)

 Pretty Good Privacy の別実装として、GPL に基づいた暗号化・復号ソフト
 暗号化のアルゴリズムとして共通鍵暗号方式や公開鍵暗号方式を使用できる
 参照先 ~/.gnupg/

# 復号(暗号解除)はオプションなしでOK
$ gpg encryptfile.txt.gpg


ナレッジ

文字コード クロック タイムゾーン 通信の暗号化 MTA FHS コマンド

文字コード

# 文字コードの変換
$ iconv -f 元文字コード -t 新文字コード 元ファイル名 > 新ファイル名

クロック

ハードウェアクロック
マザーボード上に実装された時計。
OSをシャットダウンしても時刻を維持する。
システムクロックと手動で時刻同期が可能。

システムクロック
OS起動時にハードウェアクロックから時刻を取得し、メモリ上に実装される時計。
システムクロックをもとにファイル管理を行う。NTPサーバと時刻同期が可能。
OSをシャットダウンすると失われる。

タイムゾーン

国や地域ごとの標準時間帯をタイムゾーンと言います。
タイムゾーン毎に協定世界時(Coordinated Universal Time: UTC)からの時差や、夏時間の実施期間などが決められています。
Linuxの内部では、UTC 1970年1月1日午前0時0分0秒からの経過秒数であるエポック(epoch)時間で時間を管理しており、設定されたタイムゾーンにしたがってエポック時間から変換して、日付時刻を扱います。
なお、エポック時間はUNIX時間(Unix Timestamp)とも呼ばれます。

/etc/timezone
システムで使用するタイムゾーンの値を指定するテキストファイル

$ cat /etc/timezone
Asia/Tokyo

/etc/localtime
 タイムゾーンバイナリファイルへのシンボリックリンク
/usr/share/zoneinfo
 タイムゾーンバイナリを収めたディレクトリ

$ ls -l /etc/localtime
lrwxrwxrwx 1 root root 30 Feb 24 17:49 /etc/localtime -> /usr/share/zoneinfo/Asia/Tokyo

$ ls -lha /usr/share/zoneinfo
total 352K
drwxr-xr-x  20 root root 4.0K Jan 22 16:02 .
drwxr-xr-x 131 root root 4.0K Feb 23 21:58 ..
drwxr-xr-x   2 root root 4.0K Jan 22 16:02 Africa
drwxr-xr-x   6 root root  20K Jan 22 16:02 America
drwxr-xr-x   2 root root 4.0K Jan 22 16:02 Antarctica
drwxr-xr-x   2 root root 4.0K Jan 22 16:02 Arctic
drwxr-xr-x   2 root root  12K Jan 22 16:02 Asia

通信の暗号化(共通鍵)

DES

AES

MTA(メールサーバ)

Postfix メール転送

# システム全体
$ vi /etc/aliases
staff: user1, test@example.com # 例
$ newaliases

# ユーザ個別
$ vi ~/.forward

FHS  Filesystem Hierarchy Standard

/
├ bin/
├ boot/  # Linux カーネルなどのシステムの起動に必要な静的ファイル
├ dev/  # システムに接続されているデバイス、またはカーネルが提供する仮想デバイスを表すデバイスノード
│  ├ hda  # プライマリー IDE チャネル上のマスターデバイス
│  ├ hdb  # プライマリー IDE チャネルのスレーブデバイス
│  ├ tty0  # 最初の仮想コンソール
│  ├ tty1  # 2番目の仮想コンソール
│  ├ sda  # プライマリー SCSI または SATA チャネルの最初のデバイス
│  ├ lp0  # 最初の並列ポート
├ etc  # ローカルの設定ファイル(.conf)
│  ├ at.allow  # at,batch許可ユーザ名を登録
│  ├ at.deny  # at,batch拒否ユーザ名を登録
│  ├ cron.allow  # cron許可ユーザ名を登録
│  ├ cron.deny  # cron拒否ユーザ名を登録
│  ├ group  # group情報
│  ├ hostname  # 自PC名 ホスト名のみを記述
│  ├ localtime
│  ├ nsswitch.conf
│  ├ passwd  # ユーザ情報(uid=, gid=, groups=)
│  ├ resolve.conf  # 名前解決の設定 nameserver, domain, search
│  ├ services  # サービス名 ポート番号/tcp|udpプロトコル
│  ├ timezone
│  ├ X11  # xorg.conf などの X Window System 設定ファイル
│  ├ skel  # ユーザーの初回作成時にホームディレクトリーを設定するために使用されるスケルトンユーザーファイル
├ home/  # 特定のユーザーにのみ関連するデータ
├ lib/  # /bin/ および /sbin/ でバイナリーを実行するために必要なライブラリーのみ
├ media/  # リムーバブルメディアのマウントポイントとして使用されるサブディレクトリー
├ mnt/  # NFS ファイルシステムのマウントなどの、一時的にマウントされたファイルシステム
├ opt/  # ほとんどのアプリケーションソフトウェアパッケージのストレージ
├ proc/  # カーネルと通信する情報 システムメモリー、CPU 情報、ハードウェア設定など
├ root/  # root ユーザーが使用する実行ファイル システム管理とシステム復旧
├ run/  # メモリ上に作成されたファイルシステム上
│  ├ log/
│  │  ├ journal/  # 再起動するとデータが消える
├ sbin/
├ srv/  # システムサイト固有 FTP,WWW,CVS等の特定サービスのデータファイルの場所をユーザーに提供
├ sys/  # カーネルに固有の新しい sysfs 仮想ファイルシステムを使用
├ tmp/
├ usr/  # 複数のマシンにまたがって共有できるファイル
│  ├ bin/
│  ├ etc/
│  ├ games/
│  ├ include/
│  ├ kerberos/
│  ├ lib/
│  ├ libexec/
│  ├ local/  # ソフトウェアをローカルでインストールする場合にシステム管理者が使用
│  │  ├ bin/
│  │  ├ etc/
│  │  ├ games/
│  │  ├ include/
│  │  ├ lib/
│  │  ├ libexec/
│  │  ├ sbin/
│  │  ├ share/
│  │  ├ src/
│  ├ sbin/
│  ├ share/
│  │  ├ zoneinfo/  # タイムゾーン情報バイナリファイル群
│  ├ src/
│  ├ tmp/ -> ../var/tmp
├ var/
   ├ account/
   ├ arpwatch/
   ├ cache/
   ├ crash/
   ├ db/
   ├ empty/
   ├ ftp/
   ├ gdm/
   ├ kerberos/
   ├ lib/
   │  ├ rpm/  # RPMシステムデータベース
   ├ local/
   ├ lock/
   ├ log/
   │  ├ lastlog  #
   │  ├ messages  #
   │  ├ syslog  # 
   ├ mail -> spool/mail
   ├ mailman/
   ├ named/
   ├ nis/
   ├ opt/
   ├ preserve/
   ├ run/
   ├ spool/
   │  ├ at/
   │  ├ clientmqueue/
   │  ├ cron/
   │  ├ cups/
   │  ├ exim/
   │  ├ lpd/
   │  ├ mail/
   │  ├ mailman/
   │  ├ mqueue/
   │  ├ news/
   │  ├ postfix/
   │  ├ repackage/
   │  ├ rwho/
   │  ├ samba/
   │  ├ squid/
   │  ├ squirrelmail/
   │  ├ up2date/
   │  ├ uucp/
   │  ├ uucppublic/
   │  ├ vbox/
   ├ tmp/
   ├ tux/
   ├ www/
   ├ yp/

コマンド備忘

$ man コマンド名  # マニュアル閲覧
$ tree  # 階層表示

$ ps -all  # 全プロセス確認

$ nc -l 8000 < response.txt  # 簡易的に疑似サーバを建て8000番ポートでlisten(-l)状態に
$ nc PCname 8000  # 別シェル/別PCから疑似サーバに接続試験

$ ifconfig  # NWインターフェース確認、設定
$ ping -c 回数 [destination]  # 56(84) bytes of data
$ traceroute  # 30 hops max, 60 byte packets
$ tracepath  # pmtu

$ dig <domain>  # DNS登録情報
$ host <domain>  # DNS登録情報
$ nslookup <domain|addr> # ドメイン/GIPの正引き/逆引き

$ route  # ルーティングテーブル確認、設定 -net NWaddr / -host HOSTaddr
$ netstat  # ローカルホストのネットワーク関連情報確認