Linux勉強メモ

Linuxの起動
Linuxが起動するまでの流れはざっくり次の通り
- 電源ボタンポチッ(ON)
- BIOS/UEFI起動
- ブートローダ起動
- カーネル起動
- initramfs起動
- systemd起動
- システム起動完了(ログインができる)
手順2 BIOS/UEFI起動
BIOS
(Basic Input Output System) : ブートデバイス(HDDやSSD)を選択して,ブートローダを起動する。
UEFI
(Unified Extensible Firmware Interface) : BIOSを改良したもの。役割はBIOSと同じ。
手順3 ブートローダ起動
ブートローダ
: カーネルを選択・起動するプログラム。ブートローダが起動すると,人間がカーネルを起動するカウントダウンが始まる。カウントダウンが0になると選択されたカーネルの起動が始まる。
手順4 カーネル起動
カーネル
: Linuxのコアとなるプログラム。ブートローダがブートデバイスから読みだして起動する。
手順5 initramfs起動
initramfs
: システム起動用の小規模ファイルシステム。ルートファイルシステムをルートディレクトリにマウントする。initramfsはカーネルにより起動される。
手順6 systemd起動
systemd
: Linuxの起動処理やシステム全体の管理を行うプロセス。initramfsが起動する(=ルートファイルシステムをマウントする)と,カーネルから読みだされて起動する。システムが起動して最初に生成されるプロセスであり,PIDは1になっている。systemdはシステムの稼働に必要なサービスを順に生成して,システムを初期化していく。
次に調べること
systemctl,サービス,ターゲット, sysvinit, upstart

リポジトリとパッケージ管理
パッケージ
: 実行プログラム,設定ファイル,ドキュメントを1つのファイルにまとめたもの。ソフトウェアのインストールはパッケージ単位で行う。パッケージ管理方式としてDebian GNU/LinuxではDebian形式,RHELではRPM形式が採用されている。
パッケージ管理システム
: パッケージのインストール/アンインストール/アップデートにおいて,パッケージの管理や,競合回避を行うシステム
apt, dpkg
: Debian形式(deb形式)のパッケージ管理コマンド
yum, rpm
: RPM形式のパッケージ管理コマンド
パッケージファイル名
deb形式のパッケージファイル名は次の形式になっている。
tree_1.7.0-5_amd64.deb
- tree : パッケージの名称
- 1.7.0 : バージョン番号
- 5 : Debianリビジョン番号
- amd64 : アーキテクチャ
- deb : 拡張子
RPM形式のパッケージファイル名は次の形式になっている。
bash-4.2.46-33.el7.x86_64.rpm
- bash : パッケージの名称
- 4.2.46 : バージョン番号
- 33.el7 : リリース番号
- x86_64 : アーキテクチャ
- rpm : 拡張子
dpkgコマンド
dpkgコマンド : deb形式のパッケージ管理コマンド。後述のapt/apt-getコマンドを用いるのが一般的。
dpkg [option] action
オプション
- -E : すでに同名パッケージがあればインストールしない
- -G : すでに新バージョンがインストールされていればインストールしない
- R : ディレクトリ内を再帰的に処理する
アクション
- -i パッケージファイル名 : パッケージをインストールする
- -r パッケージ名 : 設定ファイルを残してパッケージをアンインストール
- -P パッケージ名 : 設定ファイルを含めてパッケージをアンインストール
- -l 検索パターン : インストール済みパッケージを検索して表示する
- -S ファイル名 検索パターン : 指定したファイルが度のパッケージからインストールされたかを表示する
- -L パッケージ名 : 指定したパッケージからインストールされたファイルの一覧を表示する
- -s パッケージ名 : パッケージの情報を表示する

シェルとシェルスクリプト
復習
環境変数
: シェル自身とそのシェルから起動されたすべてのプロセスで有効な変数
シェル変数
: そのシェルでのみ有効な変数(シェルから起動されたプロセスでは無効)
シェルのオプション設定
setコマンド : シェル変数の定義,オプションの設定を行う。引数を指定しなければ,シェル変数と環境変数を一覧表示する。
set [-o][+o] [オプション]
-o : オプション有効化
+o : オプション無効化
エイリアス
エイリアス : コマンドに別名と付与したり,コマンドとオプションをひとまとめにして新しいコマンドにする機能
ex.) ls
コマンドをls -l
で実行するエイリアスの設定
alias ls='ls -l'
ex.) lsエイリアスの解除
unalias ls
ex.) lsエイリアスが有効な状態で,オプションなしのls
コマンドを実行する
\ls
関数の定義
[function] 関数名() { コマンド; }
[function]
関数名()
{
コマンド
}
ex.) シンボリックリンクのファイルのみリスト表示するlslink関数
lslink() { ls -l | grep '^l'; }
ex.) 引数で指定したディレクトリにある,シンボリックリンクのファイルのみリスト表示するlslink関数
lslink() { ls -l $1 | grep '^l'; }
定義済み関数の定義を表示する。関数の削除はunsetコマンドを用いる。
declare -f 関数名
シェルスクリプト
シェルスクリプトの実行
. テキストファイル名
はsource テキストファイル名
の省略形である。bashコマンドでシェルスクリプトを実行すると,子プロセスとして実行されるからシェル変数は引き継がれない。sourceコマンドで実行した場合は,元のシェル上で実行されるため,シェル変数が引き継がれる。
bash テキストファイル名
source テキストファイル名
. テキストファイル名
シェルスクリプトの引数
変数名 | 意味 |
---|---|
$0 | スクリプトファイル名 |
$n | 第n引数 |
$# | 引数の数(スクリプトファイル名は含まない) |
$@ | 全ての引数のスペース区切り |
#* | 全ての引数 |
shiftコマンド : 変数に格納された引数を1つずつずらす。
シェルスクリプトの戻り値
シェルスクリプトの戻り値である終了ステータスexit status
はコマンドが正常に実行されたか/以上終了したかを表す。戻り値は$?
に格納される。
0
: 正常終了
0以外
: 異常終了
条件文とtestコマンド
条件文は次のどちらかで記述する。
test 条件文
[ 条件文 ]
条件分岐
条件式にtest 条件文
や[ 条件文 ]
ではなく,別のシェルスクリプトの実行結果を指定したときは,成功のときtrue, それ以外のときfalseとみなされる。
if 条件式
then
実行文1
else
実行文2
fi
case文
case 式 in
値1)
実行文1;;
値2)
実行文2;;
for文
for 変数名 in スペース区切りの文字列
do
実行文
done
while文
while 条件文
do
実行文
done
その他
シェルスクリプトの1行目にはそれがシェルスクリプトであること,実行するシェルのパスが分かるように次を記述する。
#! /bin/bash

ネットワーク関連の設定・コマンド
/etc/services
ポート番号とサービスの対応が記述されている。
/etc/hostname
ホスト名が記述されている。ex.) centos7.example.com
/etc/hosts
ホスト名(別名含む)とIPアドレスの関係が記述されている。ex.) 127.0.0.1 localhost
コマンドによるネットワーク設定
NetworkManager : CentOSやRHELに導入されているネットワークを管理するサブシステム
NetworkManagerの状態確認
systemctl status NetworkManager
NetworkManagerでは,nmcliコマンドを使ってネットワーク設定の確認・変更が行える。
nmcli オブジェクト [コマンド]
オブジェクトとその意味
オブジェクト | 意味 |
---|---|
general | ホスト名の確認・変更 |
networking | ネットワークの状態確認・有効化/無効化 |
radio | wi-fiの状態確認・有効化/無効化 |
connection | 接続情報の確認・有効化/無効化 |
device | デバイスの設定確認・接続/切断 |
ipコマンド : ネットワークインターフェース・ルーティングテーブル・ARPテーブルを確認・設定するためのコマンド
ip 操作対象 [サブコマンド] [デバイス]
操作対象
- link : ネットワークインターフェース
- addr : IPアドレス
- route : ルーティングテーブル
サブコマンド
- show : 表示する
- add : 設定する
ifconfigコマンド : ネットワークインターフェースの状態を表示したり,設定を行ったりする。引数無しで実行すると,アクティブなネットワークインターフェースを表示する。1番目のネットワークインターフェースはeth0,2番目のネットワークインターフェースはeth1のように表す。
ifconfig [ネットワークインターフェース名] [パラメータ名]
パラメータ
- IPアドレス : IPアドレスを設定する
- netmask サブネットマスク : サブネットマスクを設定する
- up : ネットワークインターフェースの有効化
- down : ネットワークインターフェースの無効化
ifup, ifdownコマンド : ネットワークインターフェースの有効化/無効化を行うコマンド
ifup ネットワークインターフェース名
ifdown ネットワークインターフェース名
ネットワーク設定・管理コマンド
ping : 指定されたホストにICMPパケットを送り,反応を表示する。LinuxのpingコマンドはCtrl+Cを押すまで繰り返される。
ping [オプション] ホスト名またはIPアドレス
オプション
-c 回数 : 指定された回数ICMPパケットを送信する
-i 間隔 : 送信する間隔(秒数)を指定する
traceroute : 指定されたホストまでパケットが伝わる経路を表示する。
traceroute ホスト名またはIPアドレス
tracepathコマンド : tracerouteコマンドと同様。
tracepath ホスト名またはIPアドレス
hostnameコマンド : ホスト名の確認,変更を行うコマンド
# ホスト名の確認
hostname
# ホスト名の変更
hostname linuc.example.com
netstatコマンド : ネットワークの機能を表示するコマンド。開いているポートの確認によく用いる。
netstat [option]
ssコマンド : 最近のディストリビューションではnetstatコマンドの代わりにssコマンドを用いることがある。
ncコマンド(netcat) : 指定ポートで待ち受けた通信を標準出力する。
nc [option] [host] [port number]
ルーティングテーブルの設定
routeコマンド : ルーティングテーブルの表示・操作を行うコマンド
# 表示
route [option]
# 追加
route add [param]
# 削除
route del [param]
DNSの設定
/etc/resolv.conf
参照先のDNSサーバーを記述するファイル
# このホストが属するドメイン
domain example.com
# ドメイン省略時に付与
search example.com
# 参照先DNSサーバー
nameserver 8.8.8.8
/etc/nsswitch.conf
名前解決は/etc/hostsの使用,DNSサーバーへの問い合わせ,LDAPサーバーへの問い合わせなど複数の手段で行える。この手段の実行順位を記述するファイルが/etc/nsswitch.confである。
hostコマンド : 名前解決の正引き/逆引きを行う
# 正引き
host ホスト名
# 逆引き
host IPアドレス
digコマンド : DNSサーバーに登録されている情報を詳しく表示するコマンド
dig [option] [@DNSサーバー名] ホスト名またはドメイン名 [type]

アカウント管理
ユーザー・グループ一覧
ユーザーアカウント情報は/etc/passwdに保存されている。/etc/passwdのフォーマットは次の通りである。UIDはrootに0,一般ユーザーは1000以降,システム管理用に1~99の番号が付けられる。
linucuser:x:1000:1000:LinuC test user:/home/linucuser:/bin/bash
ユーザー名:パスワード(暗号化を示すx):UID:GID:コメント:ホームディレクトリ:デフォルトシェル
/etc/passwdは一般ユーザーも読み取り権があるためパスワード(ハッシュ)は/etc/shadowに格納するようになっている(この仕組みをシャドウパスワードという)。/etc/shadowはルートユーザーしか読み取れない。
グループの設定は/etc/groupに記述されている。/etc/groupsのフォーマットは次の通りである。グループパスワードのハッシュ値は/etc/gshadowに保存される。また,ユーザーは複数のグループに所属でき,基本となるグループをプライマリグループ,それ以外のグループをサブグループと呼ぶ。
staff:x:1001:linucuser
グループ名:グループパスワード:GID:グループメンバー(カンマ区切り)
ユーザーアカウントの設定
useraddコマンド : ユーザーを追加する。オプションでコメントやホームディレクトリ,属するグループ,デフォルトシェルを設定できる。useraddコマンドで作成されるユーザーのデフォルト設定は/etc/default/useradd
に記述されている。また,ユーザー作成時にホームディレクトリも同時に作成される。このホームディレクトリに配置されるデフォルトのファイル設定は/etc/skel/
に配置される。
useradd [option] ユーザー名
usermodコマンド : 既存のユーザーアカウント設定を変更する。
usermod [option] ユーザー名
userdelコマンド : 既存のユーザーアカウントを削除する。デフォルトでは,そのユーザーのホームディレクトリは削除されない。
userdel [option] ユーザー名
オプション
- -r : ホームディレクトリを削除する。
passwd : パスワードを変更する。ルートは任意のユーザーのパスワード,それ以外は自ユーザーのパスワードを変更できる。
passwd [option] ユーザー名
groupaddコマンド : グループを作成する。
groupadd グループ名
groupmodコマンド : グループ情報を変更する。
groupmod [option] グループ名
オプション
- -g GID : GIDを変更する。
- -n グループ名 : グループ名を変更する。
groupdel : グループを削除する。対象グループをプライマリグループとするユーザーが存在する場合は削除できない。
groupdel グループ名
idコマンド : ユーザーが所属しているグループのグループを表示する。
id [ユーザー名]
getentコマンド : LDAP等のユーザー情報を一括表示する。
getent 対象

セキュリティ
SUID/SGIDビットが設定されたファイルの調査
SUIDが設定されたファイルはroot権限で動作する → 不用意にSUIDを設定するとそのファイルを利用してroot権限を所得され,許可されない操作が行われる可能性がある。
SUIDが設定されているファイルの調査方法
find / -perm -u+s -ls
パスワードの管理
パスワードに有効期限を設定することで,強制的にパスワード変更をユーザーに促せる。有効期限の設定はchange
コマンドで行う。オプション無しで実行すると,対話モードになる。設定は/etc/shadowに記述される。
change [option] [ユーザー名]
ユーザーのログイン状況の管理
ユーザーログイン状況/履歴を管理することで,不審なログインを見つけ出すことができる。ログイン中のユーザーを調べる方法としては次のコマンドがある。これらのコマンドは/var/run/utmpの情報を参照している。
- whoコマンド : ログイン中のユーザー名/ログイン端末/ログイン日時/ログイン元IPアドレスを表示する。
- wコマンド :ログイン中のユーザー名に加えてシステム情報を表示する。
- lastコマンド : 最近ログインしたユーザーの一覧を表示する。/var/log/wtmpを参照する。
開いているポートの確認
開いているポートは次のコマンドで確認できる。
-
netstat -atu
:開いているすべての(-a
)TCP(-t
)およびUTP(-u
)のポートを表示する。 -
ss -atu
: ssコマンドはnetstatコマンドと同義 -
lsof -i
: プロセスが開いているポートのうち開いているポート(-i
)を表示する。
攻撃者が開いているポートを確認する行為をポートスキャンと呼ぶ。ポートスキャンにはnampコマンドが用いられる。
nmap 対象ホスト
ポートを開いているプロセスの特定にはfuserコマンドを用いる。
ex. 25/TCPを開いているプロセスを特定する。
fuser -n tcp 25
ユーザーのログイン制限
ユーザーがログインしてシェルを利用する必要ないメールサーバー等では,一般ユーザーのログインを制限することができる。次にfredユーザーのログインを禁止する例を示す。
usermod -s /sbin/nologin fred
また,/etc/passwdのユーザーfredの項目を直接編集することでもログインを禁止できる。
# /etc/passwd
fred:x:1001:1001::/home/fred:/sbin/nologin
一定時間端末への入力がなければログアウトさせるように設定することもできる。このようなときは環境変数TMOUT
に自動ログアウト秒数を記述する。

疑問の解決
ログインシェルと対話型シェルって何が違うん?
ログイン処理 : ユーザーがシステムにログインする際に最初に起動されるシェル
対話型シェル : ユーザーが直接コマンドを入力して対話できるシェル
じゃあログインシェルと対話型シェルは同じでは?
ログインシェルが対話型シェルを含んだ包含概念。対話型シェルはシステムの初期化ファイルは読み込まず、シェル固有の対話型設定ファイル(~/.bashrc)だけ読み込む。これに対してログインシェルはシステムの初期化ファイル