サーバ管理
時刻の調整 ジョブの自動実行 ログを取る ユーザ管理 クライアント管理
ネットワーク管理 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
- 「/etc/at.allow」ファイルがあれば、記述のあるユーザのみが利用可能
- 「/etc/at.allow」ファイルがなければ、「/etc/at.deny」を参照し、そこに記述のないユーザが利用可能
- 両方のファイルがなければ、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
/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 # 名前解決せずにルートテーブル表示(結果的に表示が速い)
遠隔ホストのポートスキャン
リモートホストで開いているポートを確認(対象とするTCP/UDPポートの範囲を指定可能)
リモートホストのOS識別を試みる
!外部サーバに対してむやみにポートスキャンをしないこと。攻撃準備とみなされる可能性あり。
$ 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-keygen実行時に設定したパスフレーズは、後から確認することができない。
忘れた場合は、キーペアを作成しなおす必要がある。
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 # ローカルホストのネットワーク関連情報確認