LPIC 1 対策メモ②

## 7.シェル、スクリプト、データ管理

### シェル環境のカスタマイズ

- 環境変数とシェル変数
	- `$ env`、`$ printenv`：環境変数を表示
	- `$ set`：環境変数とシェル変数を表示
		- `set` で環境変数のセットは行えない。`export` を使う。
	- `$ printenv HOME`：１つだけ表示

- シェルのオプション
	- `$ set -o noglob`：noglob （メタキャラクタを使ったファイル名展開無効化）オプションを有効化
	- `$ set +o noglob`：無効化
	- `$ set -o`：設定されているオプション確認
	- `$ set -o noclobber`：リダイレクトに寄る上書き禁止
		- `$ set -C` と同義

- エイリアス

``` sh
$ alias ls='ls -l' # ''でくくる
$ alias lsless='ls -l | less'
$ unalias lsless # 解除
$ unalias -a # 全 alias 解除
$ \lsless # 一時的に alias を使用しない
$ alias # エイリアス全表示
```

- 関数の定義

``` sh
$ function lslink() {ls -l | grep '^l';} # シンボリックリンクファイルのみリスト表示
$ function lslink() {ls -l $1 | grep '^l';} # 引数は $1 などで使う
$ set # 関数リストも表示（bash は関数と変数を区別しない）
$ declare -f lslink # 定義されている関数表示
$ declare -f # 全表示
$ unset lslink # 削除
```

- bash の設定ファイル
	- /etc/profile
		- bash ログイン時に実行、全ユーザから参照
	- /etc/bash.bashrc
		- bash 起動時に実行、全ユーザから参照
	- ~/.bash_profile
		- ログイン時に実行、ユーザ独自
		- 存在しなければ
			- ~/.bash_login
			- ~/.profile  
			の順に実行
	- ~/.bashrc
		- 対話型シェルが起動されるたびに実行
	- ~/.bash_logout
		- ログインシェルの終了時

### シェルスクリプト

- シェルスクリプトの基礎

``` sh
$ source script # 実行 # スクリプトファイルに読み取り権、ディレクトリに実行権（スクリプトファイルの実行権は不要）
$ . script # 簡略化
$ chmod a+x script
$ ./script # 実行権を与えればファイル名だけで実行
$ exec zsh # 子プロセスとしてではなく、実施しているシェルのプロセスが指定したコマンドのプロセスに置き換わる。
# シェルを待機させる必要がないケースに使用
```

``` sh
$ cat testargs
echo $0 # シェルスクリプトファイル名（フルパス）
echo $1 # 1番目の引数
echo $2 # 2番目
echo $# # 引数の数
echo $$ # プロセス番号
$ ./testargs args1
./testargs
args1

1
16179
```

``` sh
$ ls -l file2
ls: file2: No such file or directory
$ echo $? # コマンドの実行結果は変数「$?」に格納される。正常終了は0
2
$ echo $?
0 # 正常終了
```

- ファイルのチェック

``` sh
test -f .bashrc # ファイルがあれば true
[ -f .bashrc ] # 上と一緒
test -d bin # ディレクトリがあれば true
"$1" -lt 10 # lower than、10未満であれば true
# -e：exsists：-f + -d
# -eq：=
# -le：lower equal：≦
# -ge：greater equal：≧
# -gt：greater than：>
# -ne：≠
# -r：読み取り権
# -w：書き込み権
# -x：実行権
# -L：シンボリックリンク
```

- 制御構造

``` sh
if test -f testscript # if [ -f testscript] と一緒。; で複数行をまとめること可
then
	source ./testscript
else
	echo "not found"
fi
```

``` sh
case $1 in
	1) echo "January" ;; # 実行文の末尾に ;;
	2) echo "Feburary" ;;
	...
	12) echo "December" ;;
esac # 最後に esac
```

``` sh
for var in Vine SUSE Gentoo
do
	echo $var Linux
done
```

``` sh
for i in `seq 10 15` # seq は連続した数値を自動的に生成（この場合 10 ~ 15）
do
	echo $i
done
```

- `seq`
	- `$ seq 開始数値 終了数値`
	- `$ seq 終了数値`：１スタート
	- `$ seq 開始数値 増加減少幅 終了数値`

``` sh
i=1
while [ $i -le 10 ]
do
	echo $i
	let i=i+1
done
```

``` sh
echo -n "Who are you? : " # -n オプションで、標準入力受付で改行されないように
read username # username に 標準入力をセット
echo "Hello, $username!"
```

``` sh
echo '1 2 3 4' | while read a b c d
do
	echo $a $b $c $d
done
```

``` sh
# usage : user-add.sh UserListFile
while read USERNAME # ファイルから読み込むことも可能
do
	useradd $USERNAME
	echo $USERNAME | passwd --stdin $USERNAME
done < $1
```

- シェルスクリプトの実行環境
	- bash 用なら１行目に `#!/bin/bash` と実行シェルを記載
		- シェルスクリプトは SUID、SGID は無視される

### データベースと SQL

- RDBMS（Relational DataBase Management System）
	- OSS
		- MySQL
		- MariaDB
		- PostgreSQL
	- 商用
		- Oracle Database
		- DB2
		- Microsoft SQL Server

``` sh
> SELECT name FROM staff;
> SELECT name, age FROM staff;
> SELECT * FROM staff;
> SELECT * FROM staff WHERE age <= 30;
> SELECT branch, name FROM staff WHERE branch = 'Tokyo';
> SELECT name, age FROM staff ORDER BY age (DESC);
> SELECT branch, AVG(age) FROM staff GROUP BY branch;
> INSERT INTO staff (id, name, branch, age) VALUES ('7', 'Sato', 'Tokyo', '30');
> UPDATE staff SET branch='Chiba' WHERE name='Tanaka';
> DELETE FROM staff WHERE name='Nakajima';
> SELECT members.name, branch.name FROM members JOIN branch ON members.branchid = branch.bid;
> SELECT members.name, branch.name FROM members, branch WHERE members.branchid = branch.bid;
```

## 8.ユーザーインターフェースとデスクトップ

### X のインストールと設定

- X Window System の概要
	- X Window System（X、X11）
		- XFree86
		- X.Org：現在の主流
	- X サーバ：ハードウェアの管理
	- X クライアント：ユーザアプリケーション（オフィスなど）

- X.Org の設定
	- /etc/X11/xorg.conf：設定
		- Section "セクション名" から EndSection までの範囲で記述
			- Files：フォントやカラーデータベースファイルのパス名
				- FontPath とか
			- Module
			- InputDevice
			- Device
			- Monitor
			- Modes
			- Screen
			- ServerLayout
	- `# Xorg -configure`：設定補助ツール
		- `# X -config /root/xorg.conf.new` でテスト
		- `# cp /root/xorg.conf.new /etc/X11/xorg.conf` でコピー

- ネットワーク経由での X の利用
	- remote で動く X クライアント（アプリ）を NW 経由で、local の X サーバを使って表示
	- `$ xhost +/-ホスト名`：X サーバ接続許可リストに追加/削除

``` sh
[lpic@localpc]$ xhost +remotepc # remotepc の X クライアントが localpc の Xサーバを利用できるよう許可
[lpic@remotepc]$ DISPLAY=localpc:0 # 環境変数 DISPLAY で X サーバを指定
[lpic@remotepc]$ export DISPLAY
[lpic@remotepc]$ rxvt & # remotepc で X クライアントを起動
```

- X クライアントコマンド
``` sh
$ showrgb：X で利用可能な色と RGB 値を表示
$ xlsclients：実行中の X クライアントを表示
$ xwininfo：指定したウィンドウのサイズや位置、色深度などの情報を取得
$ xdpyinfo：ディスプレイ情報を表示
```

- X サーバの起動
	- `$ startx`
	- X の起動順序（TODO）

### ディスプレイマネージャの設定

- ディスプレイマネージャ：GUI でログイン画面を表示し、ユーザ認証を行うソフトウェア
	- XDM：X.Org 標準
		- 設定ファイル /etc/X11/xdm/xdm-config
	- GDM：Gnome で利用
		- 設定ファイル /etc/X11/gdm
	- KDM：KDE で利用
		- 設定ファイル /etc/X11/kdm
	- LightDM（Ubuntu）

- LightDM 用のユーザーインターフェース
	- Greeter
	- /etc/lightdm/lightdm.conf：設定ファイル

- ディスプレイマネージャの切り替え
	- SysVinit 系
		- /etc/inittab ファイル
			- id:5:initdefault（グラフィカルログイン）
	- systemd 系
		- `# systemctl enable/disable gdm.service`

- ウィンドウマネージャ：X の外観を制御するソフトウェア
	- ウィンドウの外観、メニュー、アイコンなどを提供する X クライアント

- デスクトップ環境
	- 統合デスクトップ環境
		- ウィンドウマネージャも含め、アプリケーションまで揃えて統一的な操作を提供
		- 代表例：
			- GNOME
			- KDE

### アクセシビリティ

- AT（Assistive Technology）：障害者を支援するソフトウェア
	- スティッキーキー（固定キー）
		- ラッチ：１回押して固定
		- ロック：２回押して押しっぱなし状態に
	- スローキー：認識する時間を調整
	- バウンスキー：連続入力を無視する
	- トグルキー：NumLock などでオンなら１回、オフなら２回ビープ音
	- マウスキー：テンキーでマウスを移動、クリック
	- リピートキー：一定時間以上押さないと繰り返しにならない

- その他のアクセシビリティ機能
	- 主なアクセシビリティ機能
		- ハイコントラスト
		- スクリーンリーダー
		- 点字ディスプレイ
		- スクリーン拡大鏡
		- オンスクリーンキーボード
	- アクセシビリティを実現する主なソフトウェア
		- Orca：スクリーンリーダー、スクリーン拡大鏡など
		- GOK（Gnome Onscreen Keyboard）：オンスクリーンキーボード
		- Emacspeak：Emacs にスクリーンリーダ機能を追加

## 9.システム管理 (1)

### ユーザーとグループの管理

- /etc/passwd：ユーザアカウント情報
	- lpic:x:1000:1000:LPI Linux:/home/lpic:/bin/bash
	- ユーザ名:パスワード:UID:GID:GECOS:ホームディレクトリ:デフォルトシェル
	- 一般ユーザでも読み取れる
	- /etc/shadow：シャドウパスワード
		- root でしか読めない
		- /etc/passwd のパスワードの代わりにこちらへ格納する
			- /etc/passwd は x になっている
		- アクセス権は -r--------
	- GID はプライマリグループ ←→ サブグループ

- /etc/group：グループアカウント
	- staff:x:1002:linux,lpic
	- グループ名:グループパスワード:GID:グループメンバー

- コマンドを用いたユーザーとグループの管理
	- `# useradd <username>`
		- `-c <コメント>`
		- `-d <ホームディレクトリパス>`
		- `-g <プライマリグループ名/GID>`
		- `-G <サブグループ名/GID>`
		- `-s <デフォルトシェルパス>`
		- `-m`：ホームディレクトリを自動的に作成
	- /etc/skel：ホームディレクトリのデフォルト
	- `# usermod <username>`：ユーザアカウントの変更
		- `-c <コメント>`
		- `-d <ホームディレクトリパス>`
		- `-g <プライマリグループ名/GID>`
		- `-G <サブグループ名/GID>`
		- `-s <デフォルトシェルパス>`
		- `-L`：パスワードをロックして一時的に無効化
		- `-U`：ロック解除
	- `# userdel <username>`：削除
		- `-r`：ホームディレクトリも同時に削除
	- `# passwd`：パスワード変更
		- `-l`：パスワードをロックして一時的に無効化
		- `-u`：ロック解除
		- スーパーユーザーはアカウント名を指定して、任意のユーザの変更が可能
	- `# groupadd`：グループ作成
	- `# groupmod`
		- `-g <GID>`：GID 変更
		- `-n <groupname>`：グループ名を変更
	- `# groupdel`
		- プライマリグループなユーザがいる場合は不可
	- `$ id <username>`：所属しているグループを調べる
	- `$ getent passwd/group`
		- LDAP を使ってユーザ情報やグループ情報を統合管理している場合、getent で一括して出力
		- username/groupname を指定することも可能

- シャドウパスワード
	- /etc/shadow に暗号化されたパスワード
	- `# pwconv`：シャドウ化されていないシステムでシャドウ化を行う
	- `# pwunconv`：逆

### ジョブスケジューリング

- cron：定期的にジョブを実行
	- `$ crontab`
		- `-e`：エディタで編集
		- `-l`：内容表示
		- `-r`：削除
		- `-i`：削除時に確認
		- `-u <user>`：ユーザ指定で編集（root のみ）

``` sh
# m h dom mon dow command
# Daily Backup
15 23 * * * /usr/local/bin/backup
# Weekly System Check
0 9,12 * * 1 /usr/local/bin/syscheck # 複数指定可能
0 */2 * * * /usr/local/bin/syscheck # 2時間おき
```

- /etc/crontab：システムの crontab
	- /etc/cron.hourly[daily][weekly][monthly] などが実行される
		- /etc/cron.d ディレクトリ以下

- anacron：システム停止中に経過してしまったスケジュールを実行できる
	- /etc/anacrontab
		- 実行タイミングは指定できない
		- RANDOM_DELAY で指定した分数以内でランダムに遅らせる

- `$ at`：１回限りの実行スケジュール
	- `-d <job>`：予約中のジョブを削除（=`$ atrm`）
	- `-l`：予約中のジョブ一覧（=`$ atq`）
	- `-f`：コマンドを記述したファイルを指定する
	- `$ at 5:00 tomorrow` などとし、対話式でコマンドを指定

- cron と at のアクセス制御
	- cron
		- /etc/cron.allow：cron の利用を許可するユーザを指定
		- /etc/cron.deny：許可しないユーザを指定。cron.allow が存在すれば無視
		- cron.allow も cron.deny もなければ全ユーザ cron 利用可能
	- at
		- /etc/at.allow
		- /etc/at.deny
		- 同上

### ローカライゼーションと国際化

- ローカライゼーション（localization）：言語や通貨単位、日付の書式などを地域や国に合わせること

- 国際化（internationalization:i18n）：最初から多言語・他地域に対応するように作られていること

- ロケール
	- `$ locale`：現在のロケール設定を確認
		`-a`：設定可能なロケール表示
		`-m`：利用できる文字コードの一覧表示
	- LC_TIME：日付や時刻の書式に関する既定
	- LC_MONETARY：通貨
	- LC_ALL：これを設定すれば全てそのロケールになる（強制）
	- LANG：設定されていないロケールはこのロケールになる

- 文字コード
	- ASCII：基本的な 128 種類の文字
	- UTF-8：Unicode を使った文字コード。32 bit
	- TODO

- `$ iconv -f eucjp -t utf8 reposrt.euc.txt > report.utf8.txt`：文字コードの変換
	- `-f`：変換前の文字コード（from）
	- `-t`：出力したい文字コード（to）
	- `-l`：扱える文字コードを表示

- タイムゾーン
	- /usr/share/zoneinfo：タイムゾーンの情報

``` sh
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime # システムで使用するタイムゾーンの設定
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime # リンクを貼っても OK
$ export TZ="Asia/Tokyo" # タイムゾーンの設定、全ユーザで使うなら /etc/timezone に設定
$ tzselect # 対話形式でタイムゾーンの設定
$ tzconfig
```

## 10.システム管理 (2)

### システムクロックの設定

- システムクロックとハードウェアクロック
	- ハードウェアクロック：ハードウェアとして内蔵された時計、電源オフでも動作
	- システムクロック：Linux 起動時にハードウェアクロックを参照して設定

``` sh
$ date #システムクロックを参照
# date 022317002015 # 変更
$ date "+%Y/%m/%d (%a)" # 「+」で始めると指定した書式で表示
2018/03/05 (月)
```

- `# hwclock`：ハードウェアクロックの参照や設定
	- `-r`：ハードウェアクロック表示
	- `-w/--systohc`：システムクロックの時刻をハードウェアクロックに設定
	- `-s/--hctosys`：ハードウェアクロックの時刻をシステムクロックに設定

- NTP による時刻設定
	- NTP (Network Time Protocol)
		- 上位の NTP サーバから取得
			- 原子時計
			- 最上位：Stratum1/Stratum2
	- `# ntpdate <NTP server name>`：NTP サーバから時刻を取得
	- NTP サーバ起動（自前で用意するときなど）
		- `# /etc/init.d/ntpd start`：SysVinit 系
		- `# systemctl start ntpd.service`：systemd 系
	- `$ ntpd -p localhost`：NTP サーバの状態照会
	- /etc/ntp.conf：設定
		- 「server」で設定

### システムログの設定

- syslog/rsyslog：他のプログラムからのメッセージを受け取り、出力元や優先度に応じて分類し、指定された出力先に送る
	- /etc/syslog.conf：syslog の動作設定
		- 「ファシリティ.プライオリティ」：出力先syslog.conf の書式
			- ファシリティ：メッセージの出力元
				- auth、authpriv：認証システム
				- cron
				- daemon：各種デーモン
				- kern：カーネル
			- プライオリティ：メッセージの優先度、指定した優先度以上のログが残る
				- emerg
				- alert
				- debug
				- none：ファシリティ無効
				- \*：全情報
				- 「以上」にしたくなかったら「=」をつける
			- 出力先
				- ファイル名
				- @ホスト名
				- ユーザ名
				- /dev/console：コンソールに出力
				- \*：全てのユーザの端末に出力
	- /etc/rsyslog.conf：rsyslog の動作設定
		- 基本的には syslog.conf と同様
		- `# systemctl reload rsyslog.service`：変更したら設定ファイルの再読込が必要

- `$ logger -p syslog.info -t Test "logger test message"`
	ファシリティ syslog、プライオリティ info、タグ Test でログを出力

- ログの調査
	- `# tail -f /var/log/messages`：継続監視
	- `# grep eht0 /var/log/messages`：grep で絞込
	- `$ who`：ログイン中のユーザ
	- `$ w`：ログイン中のユーザ & システム情報
		- who や w は /var/run/utmp を参照
	- `$ last`：最近ログインしたユーザの一覧
	- `$ lastlog`：ユーザごとに最近のログイン一覧
	- `$ journalctl`：systemd のログ閲覧
		`-u Unit名`：指定した Unit のログを出力する

|ログファイル|コマンド|
|:-:|:-:|
|/var/log/messages|less、tail、grep など|
|/var/log/syslog|less、tail、grep など|
|/var/log/secure|less、tail、grep など|
|/var/log/wtmp|last|
|/var/run/utmp|who、w|
|/var/log/lastlog|lastlog|

- ログファイルのローテーション
	- 順々にリネームされる
	- logrotate ユーティリティが提供
	- cron を利用して定期的に実行
	- /etc/logrotate.conf：設定

### メール管理

- メール配送の仕組み
	- MUA（Mail User Agent）：メールクライアントソフトウェアでメール作成
	- 送信用 MTA（Mail Transfer Agent）へ送られる
	- 配送先メールサーバを調べ、受信用 MTA に配送
	- MDA（Mail Delivery Agent）：ローカル配送プログラムが、宛先ユーザのメールボックスに格納
	- 受取人は POP/IMAP サーバを経由して、自分のメールボックスからメールを取り出す

- SMTP サーバ：メール送信サーバ（MTA）
	- sendmail
	- Postfix
	- qmail
	- exim

- MTA の起動
	- `netstat -atnp | grep 25`：25番ポートを開いているソフトウェアを調べれば稼働している MTA が分かる
	- `# /etc/init.d/postfix start`：SysVinit 系
	- `# systemctl start postfix.service`：systemd 系

- メールの送信と確認
	- `$ mail -s samplemail student`：student 宛にメール送信
	- `$ mail`：メールボックスに届いているメール確認

- メールの転送とエイリアス
	- /etc/aliases ファイル
		- root: admin, lpic：root 宛のメールを admin と lpic が受け取れるようになる（root には届かなくなる）
		- `# newaliases`：設定を有効にする
	- .forward ファイル
		- ユーザ各自が設定できる

- `$ mailq`：メールキューの内容表示（送信サーバが停止していたりすると、メールキューに貯まる）

### プリンタ管理

- 印刷の仕組み
	- CUPS（Common Unix Printing System）：印刷サブシステム
	- `# /etc/init.d/cups start`：SysVinit 系
	- `# systemctl start cups.service`：systemd 系
	- `$ netstat -at | grep ipp`：IPPサービス（ポート 631/tcp が開いていれば CUPS は動作している）
	- /etc/cups/cupsd.conf：設定ファイル

- 印刷関連コマンド
	- `$ lpr -#5 /etc/passwd`：/etc/passwd を 5 部印刷
		- `-P`：プリンタ指定
	- `$ dmesg | lpr`：標準入力から受け取ることも可能
	- `$ lpq`：プリントキューの内容表示
		- `-P`：プリンタ指定
	- `$ lprm <ジョブ番号>`：プリントキューの印刷要求削除
		- `-P`：プリンタ指定
		- `$ lprm -`：自分の印刷ジョブ全削除（root なら全ユーザの全ジョブ削除）

## 11.ネットワークの基礎

### TCP/IP の基礎

- TCP/IP プロトコル
	- TCP、IP に加え、UDP などの関連プロトコルを含むプロトコル群

|OSI 参照モデル|TCP/IP の構造|プロトコル|
|:-:|:-:|:-:|
|アプリケーション層<br>プレゼンテーション層<br>セッション層|アプリケーション層|HTTP、SMTP、TELNET など|
|トランスポート層|トランスポート層|TCP、UDP など|
|ネットワーク層|インターネット層|IP、ICMP など|
|データリンク層<br>物理層|ネットワークインターフェース層||


- 代表的なプロトコル
	- TCP（Transmission Control Protocol）
		- コネクション型、エラー制御を TCP に任せてしまえる
		- FTP、Telnet、POP、SMTP など多数の上位プロトコルで利用
	- IP（Internet Protocol）
		- ルーティングを司るコネクションレス型プロトコル
	- IPv6
		- 32 bit → 128 bit
	- UDP（User Datagram Protocol）
		- コネクションレス型、アプリケーションが直接 IP を扱える
		- DNS、NFS などで利用
	- ICMP（Internet Control Message Protocol）
		- エラーメッセージや制御メッセージを伝送するコネクションレス型プロトコル
		- ping や traceroute コマンドで利用

- IP アドレス（IPv4）
	- サブネットマスク：ネットワーク部とホスト部を区別
	- ネットワークアドレス：ホスト部が 0
	- ブロードキャストアドレス：ホスト部が すべて 1
	- クラス
		- A：ネットワーク部が 8 bit
		- B：ネットワーク部が 16 bit
		- C：ネットワーク部が 24 bit
	- ローカルループバックアドレス：127.----
	- デフォルトルート：0.----
	- プライベートアドレス
		- A：10.0.0.0 ~ 10.255.255.255
		- B：172.16.0.0 ~ 172.31.255.255
		- C：192.168.0.0 ~ 192.168.255.255
	- CIDR：クラスよりも細かくネットワーク部を指定
		- 192.168.0.0/26

- IP アドレス（IPv6）
	- 2001:db8::1:2345:6789:abcd
		- 16 bit × 8 ブロック
		- 各ブロックの先頭の 0 は省略可
		- 0 が連続するブロックは１箇所だけ省略可
	- ユニキャストアドレス：１つのネットワークインタフェースを識別するアドレス
	- エニーキャストアドレス：複数のホストの集合
	- マルチキャストアドレス：ブロードキャストアドレス
		- ::1/128：ローカルループバックアドレス
		- 2000::/3：グローバルユニキャストアドレス
		- fe80::/10：リンクローカルユニキャストアドレス
		- ff00::/8：マルチキャストアドレス
	- プレフィックス：ネットワーク部に相当、64 bit
	- インターフェース ID：ホスト部に相当、64 bit

- ポート
	- ウェルノウンポート：0 ~ 1023 番まで予約
		- 20,21：FTP
		- 22：SSH
		- 23：telnet
		- 25：SMTP
		- 53：DNS
		- TODO
	- 登録ポート：1024 ~ 49151
	- ダイナミック/プライベートポート：49152 ~ 65535
	- 表記
		- 10.157.82.100:80
		- [fe80::20c:29ff:fe55:94ef]:80
	- ポート番号とサービスの対応は /etc/services に記述

### ネットワークの設定

- ネットワークの基本設定
	- /etc/hostname：ホスト名が記述
	- /etc/hosts：ホスト名と IP アドレスとの対応
		- 小規模ネットワークなら DNS 無しで名前解決できる
		- ホスト名を設定するのはあくまで /etc/hostname
	- /etc/network/interfaces：Debian 系、ネットワークインタフェースの設定を記述
	- /etc/sysconfig/network-scripts ディレクトリ：Red Hat 系、ネットワークインタフェースの設定ファイルを配置

### ネットワークのトラブルシューティング

- 主なネットワーク設定・管理コマンド
	- `# ping <host/IP address>`：ICMP パケットを送り反応を表示
		- `-c`：指定した回数
		- `-i`：指定した間隔（秒）、デフォルトは 1
		- IPv6 なら `ping6`
	- `# traceroute <host/IP address>`：パケットが伝わる経路を表示
		- IPv6 なら `traceroute6`
	- `# tracepath/tracepath6`：traceroute と同様
	- `$ hostname`：現在のホスト名を表示
		- `# hostname lpic.example.net`：ホスト名変更（管理者のみ）
	- `$ netstat`：ネットワーク機能に関する様々な情報を表示
		- 開いているポートの確認に利用
		- `-a`：すべてのソケット情報を表示
		- `-n`：名前解決せず、数値でアドレスやポートを表示（DNS が落ちてるときなど）
		- `-r`：ルーティングテーブルを表示
		- `-t`：TCP ポートのみ表示
		- `-u`：UDP ポートのみ表示
		- State 欄
			- LISTEN：接続待受中
			- ESTABLISHED：接続中
	- `$ nc`：netcat、テキストストリームに対する cat と同様の働きを ネットワークで
		`$ nc -l -p 12345 -o listen.log`：12345 ポートで待受、listen.log に吐き出し
		`$ nc centos7.example.com 12345 < data.txt`：上記の例を実行したホストの 12345 に対して data.txt ファイルの内容を出力
	- `$ route`：ルーティングテーブルの表示や操作
		- `$ route`：ルーティングテーブル表示（=`$netstat -r`）
		- `# route add`：経路追加
			- `# route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.30.0.254`
			- `# route add default gw 172.30.0.1`
		- `# route del`：経路削除
			- `# route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.30.0.254`
	- `$ ip`：ネットワークインタフェース、ルーティングテーブル、ARP テーブルを管理
		- route や ifconfig などを合わせたような働き
		- 操作対象
			- link：データリンク
			- addr：IP アドレス
			- route：ルーティングテーブル
		- サブコマンド
			- show：表示
			- add：設定
		- `$ ip link/route show`
		- `$ ip addr show eth0`：eth0 インターフェースの状態や IP アドレスの表示
		- `# ip addr add 192.168.11.12/24 dev eth0`：eth0 の IP アドレスを設定
		- `# ip route add default via 192.168.11.1`：デフォルトゲートウェイ設定

- ネットワークインターフェースの設定
	- `$ ifconfig`：ネットワークインターフェースの状態を表示・設定
		- `# ifconfig eth0 192.168.0.50 netmask 255.255.255.0`：ネットワークインターフェース eth0 に IP、サブネットマスクを設定
		- 永続的ではない
	- `# ifup/ifdown <ネットワークインターフェース名>`：ネットワークインタフェースの有効/無効化
		- `# ifconfig eth0 up/down` と同義

### DNS の設定

- DNS 概要
	- ホスト名 → IP アドレス：正引き
	- IP アドレス → ホスト名：逆引き
	- www.example.com：FQDN
		- www：ホスト名
		- example.com：ドメイン名
		- .：ルートドメイン
		- com：トップドメイン

- DNS の設定ファイル
	- /etc/resolv.conf：参照先 DNS サーバを設定
		- domain：ホストが属するドメイン名
		- nameserver：見に行く DNS サーバの IP アドレス
	- /etc/nsswitch.conf
		- 名前解決には
			- /etc/hosts
			- DNS サーバ
			- LDAP サーバ  
			などの手段がある
		- どういう順で利用するか設定する
		- `hosts:  files dns ldap`

- DNS 管理コマンド
	- `# host`：DNS サーバを使った情報表示
		- `# host www.lpi.jp`：IP を調べる
		- `# host 192.168.0.6`：ホスト名を調べる
	- `$ dig`：DNS サーバに登録されている情報を詳しく表示
		- `$ dig lpi.jp mx`：lpi.jp のメールサーバ情報の問い合わせ
			- a：IP アドレス
			- any：全ての情報
			- mx：メールサーバ
			- ns：ネームサーバ

## 12.セキュリティ

### ホストレベルのセキュリティ

- スーパーサーバの設定と管理
	- デーモン：常駐するプログラム
		- 待機中でもリソースを食う
	- スーパーサーバ
		- inetd
		- xinetd
		- 他のサーバプログラムに代わってサービス要求を監視し、必要に応じて本来のサーバプログラムに引き渡し
		- FTP や Telnet など頻度が高くないもの
		- Web サーバやメールサーバは頻度が高くレスポンスが重要なので、自分自身で監視（スタンドアローン）

- inetd の設定
	- /etc/inetd.conf
	- 変更したら再起動
		- `# kill -HUP <inetd の PID>`
		- `# killall -HUP inetd`
		- `/etc/init.d/inetd restart`
	- 不要なサービスは # でコメントアウト

- TCP Wrapper によるアクセス制御
	- telnetd や ftpd などのサーバプログラムの代わりにサービス要求を受ける
	- /etc/hosts.allow
	- /etc/hosts.deny
	- allow が優先される

``` sh
# /etc/hosts.allow
sshd: .lpic.jp # lpic.jp ドメインからの SSH アクセスを許可
ALL: 192.168.2. # 192.168.2. ネットワークからのアクセスをすべて許可

# /etc/hosts.deny
ALL: ALL # それ以外すべて拒否
```

- xinetd の設定
	- /etc/xinetd.conf：全体的な設定
	- /etc/xinetd.d/：個々のサービスごとの設定ファイル
		- /etc/inetd.conf で１行ごとに設定していた内容をファイルごとに
		- サービスを利用したくない場合は 「disable = yes」
	- 変更後は再起動
		- /etc/init.d/xinetd restart

- 開いているポートの確認
	- `$ netstat -atu`
	- `$ lsof -i`
		- `-i`：開いているポートの情報を表示
		- `-i:<port>`：ポートを指定
		- `lsof`：ファイルを開いているプロセスを表示
	- ポートスキャン
		- `$ nmap <host>`：開いているポートを確認できる
	- `$ fuser -n tcp 8080`
		- `fuser`：ファイルやソケットを使用しているプロセスを特定するコマンド

- SUID が設定されているファイル
	- `# find / -perm -u+s -ls`：SUID が設定されているファイル一覧
		- `-g+s` とすれば SGD
		- `-o+t` とすればスティッキービット

### ユーザに対するセキュリティ管理

- パスワード管理
	- `# chage lpic`：対話形式でパスワードに有効期限を設定
		- 最低間隔日数
		- 最大有効期限日数
		- 最終更新日
		- 有効期限切れ日数
		- 有効期限切れ後、使用不能に為るまでの日数
		- アカウントを無効化する日付

- ログインの禁止
	- /etc/nologin ファイルを作成しておくと、root 以外のアカウントはログイン禁止
		- ファイルに記述した内容が、一般ユーザのログイン画面に表示される
	- `# usermod -s /sbin/nologin lpic`：ユーザのログインシェルを /sbin/nologin や /bin/false にすると、ログインを禁止できる
		- メールや FTP ではユーザは必要なので、ユーザはありつつログイン禁止、ができる

- ユーザの切り替え

``` sh
$ su - fred # カレントディレクトリ、環境変数を初期化
$ su fred # そのまま
$ su - # root へ
```

- sudo
	- 任意の管理者コマンドを任意のユーザに許可できる
	- `# visudo`
		- /etc/sudoers を編集
		- `student ALL=(ALL) /sbin/shutdown`：student に shutdown を許可
		- `student ALL=(ALL) ALL`：student に全許可
		- `%wheel ALL=(ALL) NOPASSWD:ALL`：wheel グループはパスワードなしですべて許可
	- 頭に `$ sudo` をつけて実行
	- `$ sudo -l`：自分に許可されているコマンド一覧

- システムリソースの制限
	`# ulimit`
		- `-a`：設定値をすべて表示
		- TODO

### OpenSSH

- SSH のインストールと設定
	- telnet は平文だが、暗号化されて安心
	- SSH サーバの機能は sshd デーモンが提供
		- /etc/ssh/sshd_config：設定ファイル
	- 起動
		- `# /etc/init.d/sshd start`：SysVinit Red Hat 系
		- `# /etc/init.d/ssh start`：SysVinit Debian 系
		- `# systemctl start sshd.service`：systemd 系
	- `$ ssh <user>@<host>`

- ホスト認証
	- ユーザ認証に先立って行われる  
	サーバが公開鍵を送り、それと持っている公開鍵が一致するかどうか
	- 初回は登録する
		- ~/.ssh/known_hosts ファイルに登録
	- ssh_host_rsa_key

- 公開鍵認証
	- あらかじめクライアントの公開鍵をサーバに登録
	- `$ ssh-keygen -t dsa`
		- `-t`：暗号化タイプ指定
			- rsa1：SSH バージョン１
			- rsa：SSH バージョン２
			- dsa：SSH バージョン２
		- `-p`：パスフレーズ変更
	- リモートの ~/.ssh/authorized_keys に追加

``` sh
$ scp ~/.ssh/id_dsa.pub sv1.lpic.jp:publickey
$ ssh sv1.lpic.jp
$ cat publickey >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ ssh sv1.lpic.jp
```

- SSH の活用
	- `$ scp`
		- `$ scp /etc/hosts sv3.example.jp:/tmp`
		- `$ scp sv3.example.jp:/etc/hosts .`
		- `$ scp data.txt fred@sv3.example.jp:`
	- `$ ssh-agent`：クライアント側で起動するデーモン、秘密鍵のパスフレーズを入力する必要がなくなる
		- `$ ssh-agent bash`
		- `$ ssh-add`：秘密鍵の登録
			- `-l`：登録した秘密鍵一覧確認
	- ポート転送（ポートフォワーディング）
		- POP3 や FTP など暗号化されていないプロトコルを使った通信の安全性を高められる
		- `$ ssh -f -N -L 10110:pop.example.net:110 student@pop.example.net`
			- -L オプション
		- X11 ポート転送：リモートの X クライアントをローカルホストで動作させる
			- /etc/ssh/sshd_config に「X11Forwarding yes」をセット
			- `$ ssh -X remote.example.net`

### GnuPG による暗号化

- 鍵ペアの作成と失効証明書の作成
	- `$ gpg --gen-key`：鍵ペアの作成
	- `$ gpg --list-keys`：作成された鍵の確認
	- `$ gpg -o revoke.asc --gen-revoke fred@example.com`：失効証明書（revoke.asc）の作成
	- `$ gpg --import revoke.asc`：鍵の無効化

- 共通鍵を使ったファイルの暗号化
	- `$ gpg -c secret.txt`：暗号化
	- `$ gpg secret.txt.gpg`：復号化（引数なし）

- 公開鍵を使ったファイルの暗号化
	- `[fred@centos7 ~]$ gpg -o pubkey -a --export fred@example.com`：公開鍵をpubkey ファイルにエクスポート、これを相手に送る
	- `[john@centos7 ~]$ gpg --import pubkey`：受け取った公開鍵をインポート
	- `[john@centos7 ~]$ gpg --sign-key fred@example.com`：公開鍵に署名（信頼できるとして）
	- `[john@centos7 ~]$ gpg -e -a -r fred@example.com important.txt`：ファイルの暗号化
	- `[fred@centos7 ~]$ gpg important.txt.asc`：復号化（引数なし）








## その他

- `$ chsh`：ログインシェル変更
- systemd：Linux システム管理用デーモン
- syslog
	- rsyslog
	- syslog-ng
- klogd：カーネルログデーモン
- FHS 的には /var/log がログ
- メール
	- 受信メールのスプール：/var/spool/mail
	- 送信メール：/var/spool/mqueue
- デフォルトルート
- whois：ドメインの情報取得
- /etc/networks：ネットワークアドレスとネットワーク名の関連付け
- /etc/sshrc：ssh ログイン後に実行される