102-6.セキュリティ
- セキュリティ管理業務を実施する
- パスワードは、「passwd,usermod,chage」コマンドで変更できたり有効期限を設定できる
- ポートは、次のようなコマンドで確認出来る
- netstate:自分の開いているポートの確認ができる
- lsof:自分の開いているポート及びファイルのプロセス情報が確認できる
- nmap:対象ホストの開いているポートを確認できる
- 実行するユーザやリソースの制限は次の通り
- su:一時的に別のユーザーになれる
- sudo:特定の管理コマンドを実行できる
- ulimit:ユーザーが利用できるリソースを制限できる
- ホストのセキュリティ設定
- 「スーパーサーバ」とは、複数のサービスを1個のデーモンが代表して監視し、必要に応じて個別のデーモンを呼び出す仕組み
- 代表的なスーパーサーバには、「inetd」「xinetd」がある
- inetdは「/etc/inetd.conf」で設定変更できる
- xinetdは「/etc/xinetd.conf」と「/etc/xinetd.d」以下の設定ファイルでネットワークのアクセス制御が出来る
- 代表的なスーパーサーバには、「inetd」「xinetd」がある
- 「TCP Wrapper」で、ネットワークのアクセス制御が出来る
- 「tcpdデーモン」は、「telnetd」「ftpd」に代わってサービス要求を監視、各サーバに処理を引き渡す
- 「スーパーサーバ」とは、複数のサービスを1個のデーモンが代表して監視し、必要に応じて個別のデーモンを呼び出す仕組み
- 暗号化によるデータの保護
- 「SSH」(Secure Shell)とは、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコルのこと
- 「ホスト認証」とは、ユーザー名とパスワード認証の前にクライアントとサーバーの正当性が正しいか公開鍵を比較する認証のこと
- 「scp」コマンドは、SSHの仕組みを使い、ホスト間で安全なファイルのコピーが出来る
- 「gpg」コマンドで「鍵の作成」「公開鍵のエクスポート、インポート」「ファイルの暗号化、復号化」が出来る
- 鍵の作成:gpg –gen-key
- 公開鍵のエクスポート:gpg -o pubkey -a –export self@example.com
- 公開鍵のインポート:gpg –import pubkey
- 暗号化:gpg -e -a -r you@example.com important.txt
- 復号化:gpg important.txt.asc
1. セキュリティ管理業務を実施する
- 運用時にセキュリティの観点から次の3点に気をつける事が重要
- パスワード管理
- システムポート情報、プロセス情報
- システムリソースの使用制限
1-1. パスワード管理
- ユーザーパスワードは、定期的に変更したり有効期限を設定することが大切であり以下のコマンドが有効
コマンド | 説明 |
---|---|
passwd | パスワード変更(rootは全アカウント、一般ユーザーは自分のパスワード) |
usermod | 指定したユーザーのパスワードのロックが可能。ログインシェルや所属グループも変更できる。 |
chage | ユーザーパスワードの有効期限の情報を変更可。 |
chage
- オプションをつけないで実行すると対話モードになる
- 設定内容は「/etc/shadow」ファイルに反映される
chage [オプション] [ユーザー名]
オプション | 説明 |
---|---|
-l(小文字のエル) | パスワードもしくはアカウントの有効期限を表示 |
-m 最低間隔日数 | パスワード変更間隔の最低日数を設定 |
-M 最大有効期限日数 | パスワードの最大有効期限日数を設定 |
-d 最終更新日 | パスワードの最終更新日を設定 |
-W 有効期限切れ日数 | パスワードの有効期限切れ警告が何日前から始まるか設定 |
-I 有効期限切れ後の日数(大文字のアイ) | パスワードの有効期限切れ後にアカウントロックされるまでの日数を設定 |
-E アカウントを無効化する日付 | ユーザーアカウントが無効になる日付を設定(-Mの場合は、日数を指定) |
ログインの禁止
- 「/etc/nologin」ファイルで一般ユーザーのログインを禁止に出来る
- 設定内容は「/etc/shadow」ファイルに反映される
- 対話的ログインを禁止するいには、「/bin/false」と「/sbin/nologin」を作る
1-2. システムポート情報、プロセス情報
- 運用しているLinuxサーバにおいて、不要なポートが開いていないかどうかを確認することは大切
- 「netstate」コマンドで、どのポートが開いているか確認出来る(外部からの攻撃を防ぐために不要なポートは閉じる事が大切)
- 「lsof」コマンドで、ポート番号だけでなくファイルを開いているプロセス情報も同時に確認できる
- 「nmap」コマンドで、対象ホストの開いているポートを確認できる
netstat
netstat [オプション]
オプション | 説明 |
---|---|
-a | すべてのソケット情報を表示 |
-c | 状況を1秒毎にリアルタイムで表示 |
-i | ネットワークインターフェースの状態を表示 |
-n | アドレスやポートを数値で表示 |
-p | PIDとプロセス名を表示 |
-r | ルーティングテーブルを表示 |
-t | TCPポートのみ表示 |
-u | UDPポートのみ表示 |
// TCPポートとUDPポートのすべてのソケット情報を表示 [vagrant@localhost ~]$ netstat -atun Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5678 0.0.0.0:* ESTABLISHED ・・・ [vagrant@localhost ~]$
lsof
オプション | 説明 |
---|---|
-i ポート番号 | 指定したポート番号のIP通信のみを表示。指定しない場合、全てが対象となり表示 |
-n | IPアドレスからホスト名への変換をしない |
-p プロセスID | 指定したPIDのプロセスのみを表示 |
-P | ポート番号からサービス名への変換をしない |
// 8080ポートのみ表示 [test@remotehost ~]$lsof -i:8080 -n COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME VBoxHeadl 1544 test 18u IPv4 0t0 TCP *:http-alt (LISTEN) [test@remotehost ~]$
nmap
nmap 対象ホスト
[vagrant@localhost ~]$ nmap example.com Starting Nmap 5.51 ( http://nmap.org ) at 2015-09-26 16:18 JST Nmap scan report for example.com (93.184.216.34) Host is up (0.18s latency). Not shown: 998 filtered ports PORT STATE SERVICE 80/tcp open http 443/tcp open https Nmap done: 1 IP address (1 host up) scanned in 13.67 seconds [vagrant@localhost ~]$
1-3. システムリソースの使用制限
- ユーザーの切替(su)やスーパユーザで実行(sudo)、システムリソースの制限(ulimit)でセキュリティを強化する
su
- 「su」コマンドで一時的に別のユーザーになれる
- 「-」を付けて実行すると直接ログインした時と同じように初期化される
- 「-」をなしで実行すると現在の環境をそのままでユーザーが切り替えられる
- 「ユーザー名」を省略するとrootユーザーに変更される
su [- [ユーザー名]]
sudo
- 「sudo」コマンドで、特定の管理コマンドも実行できる
- 「visudo」コマンドでsudoの設定ができる(「/etc/sudoers」ファイルが開かれる)
- 「sudo -l」で実行が許可されているコマンドが調べられる
visudoの例) # studentユーザーのみ、shutdownコマンドが実行できるように設定する例 student ALL=(ALL) /sbin/shutdown ① ② ③ ④ ⑤ ①ユーザー名 ②ホスト名 ③(実行ユーザー名) ④[NOPASSWD:] ⑤コマンド
ulimit
- 「ulimit」コマンドで、ユーザーが利用できるリソースを制限できる
ulimit [オプション [リミット]]
オプション | 説明 |
---|---|
-a | 制限の設定値を全て表示 |
-c [サイズ] | 生成されるコアファイルのサイズを指定 |
-f サイズ | シェルが生成できるファイルの最大サイズをブロック単位で指定 |
-n 数 | 同時に開くことのできるファイルの最大数 |
-u プロセス数 | 1人のユーザーが利用できる最大プロセス数を指定 |
-v サイズ | シェルが利用できる最大仮想メモリサイズを指定 |
[vagrant@localhost ~]$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 2818 max locked memory (kbytes, -l) 64 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) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
SUIDの設定
- プログラムに「SUID」を設定すると、一般ユーザーで実行してもrootユーザーで実行したことになる
- 「find / -prem -u+s -ls」コマンドでSUIDが設定されているファイルを検索できる
- セキュリティの安全を考えると「SUID」の設定は最低限に留めるべき
- 詳しくは、101-4. デバイス、Linuxファイルシステム階層標準参照
2. ホストのセキュリティ設定
- 外部からの侵入に対するセキュリティを高める
- 不要なサービスのインストール・起動はしない
- ホストレベルの適切なアクセス制御を行う
- パケットフィルタリングによりアクセスを制御する
- セキュリティ情報の確認を頻繁に行い、必要があれば素早く対策を実施する
- 内部からの侵入に対するセキュリティを高める
- 適切なユーザーパスワード管理を行う
- スーパーユーザー権限で動作するプログラムを最小にする
スーパーサーバの設定と管理
- 「スーパーサーバ」とは、複数のサービスを1個のデーモンが代表して監視し、必要に応じて個別のデーモンを呼び出す仕組み
- 「デーモン」とは、メモリ上に常駐して様々なサービスを提供するプロセス(典型的なデーモンは名前の最後尾に “d” が付く。)
- デーモンが多いと消費するリソースも多くなるため、スーパーサーバが代表して監視する
- 代表的なスーパーサーバには、「inetd」「xinetd」がある(大抵のディストリビューションはxinetdが採用されている)
inetdの設定
- 「/etc/inetd.conf」でinetdの設定が変更できる
/etc/inetd.confの一部内容) ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.ftpd ① ② ③ ④ ⑤ ⑥ ⑦ ①service_name:/etc/servidesで定義されているサービス名 ②socket_type:ソケットタイプ(TCPはstream、UDPはdgram) ③protocol:プロトコル(ほとんどはtcpかudp) ④flag:サービス要求処理方法(wait(1個ずつ処理)かnowait(同時に処理)) ⑤user:サービス実行ユーザー名 ⑥program:サーバプログラム(デーモン)へのフルパス ⑦args:サーバプログラムに渡す引数
xinetdの設定
- 「/etc/xinetd.conf」と「/etc/xinetd.d」以下の設定ファイルでネットワークのアクセス制御が出来る
- 「/etc/xinetd.conf」:全体的な設定
- 「/etc/xinetd.d」:サービスごとの設定
- 設定変更後はxinetdの再起動が必要(#/etc/init.d/xinetd restart)
「etc/xinetd.conf」の設定例) defaults { instances = 60 # 各サービスの最大デーモン数 log_type = SYSLOG authpriv # ログ出力先 log_on_success = HOST PID # 接続を許可した時にログに記録する内容 log_on_failure = HOST # 接続を拒否した時にログに記録する内容 cps = 25 30 # 1秒間の最大コネクション数、限度時のサービス休止秒数 } includedir /etc/xinetd.d # サービスごとの設定ファイルのディレクトリ
「/etc/xometd.d/telnet」の設定例) service telnet # サービス名 { disable = no # サービスの有効/無効 socket_type = stream # 通信タイプ wait = no # ウェイトタイム user = root # サービス実行ユーザー名 server = /usr/sbin/in.telnetd # サーバプログラムへのフルパス log_on_failure += USERID # 接続を拒否した時にログに記録する内容 }
TCP Wrapperによるアクセス制御
- 「TCP Wrapper」で、ネットワークのアクセス制御が出来る
- 「/var/log/secure」ファイルにログが出力される
TCP Wrapperによるアクセス制御の流れ) クラアントからアクセス ↓ hosts.allowに入っている ↓yes |no 【アクセス許可】 ↓ hosts.denyに入っている ↓yes ↓no 【アクセス拒否】 【 アクセス許可】 (hosts.allowに入っていればhosts.denyは参照せずにアクセスを許可する)
3. 暗号化によるデータの保護
- 「SSH」(Secure Shell)とは、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコルのこと
- Linuxでは、OpenBSDグループによるSSHの実装である「OpenSSH」が一般的に利用されている
OpenSSHのインストールと設定
- OpenSSHは、ディストリビューションでインストールするパッケージが異なる
- Devianの場合
- openssh-clientパッケージ
- openssh-serverパッケージ
- Red Hatの場合
- opensshパッケージ
- openssh-clientパッケージ
- openssh-serverパッケージ
- Devianの場合
- Openはインストールするとホストの公開鍵と秘密鍵が作成される
- 「/etc/ssh/sshd_config」ファイルにsshの設定が記述されている
- 「ssh」コマンドでログイン出来る
ssh [[ログインユーザー名@]ホスト]
ホストの公開鍵と秘密鍵
ファイル名 | 説明 |
---|---|
ssh_host_key | 秘密鍵(バージョン1用) |
ssh_host_dsa_key | 秘密鍵(バージョン2、DSA用) |
ssh_host_rsa_key | 秘密鍵(バージョン2、RSA用) |
ssh_host_key.pub | 公開鍵(バージョン1用) |
ssh_host_dsa_key.pub | 公開鍵(バージョン2、DSA用) |
ssh_host_rsa_key.pub | 公開鍵(バージョン2、RSA用) |
ホスト認証
- 「ホスト認証」とは、ユーザー名とパスワード認証の前にクライアントとサーバーの正当性が正しいか公開鍵を比較する認証のこと
- クライアントは、初回接続時は公開鍵をもっていないためサーバーから公開鍵を取得する
- 「~/.ssh/known_hosts」ファイルに公開鍵は登録される
公開鍵認証
- 「公開鍵認証」では、公開鍵と秘密鍵のペアを使って認証する
- 「ssh-keygen」コマンドで公開鍵と秘密鍵の鍵ペアを作成できる
- クライアントで作成した公開鍵をサーバーの「~/.ssh/authorized_keys」ファイルに追記する
ssh-keygen [オプション]
オプション | 説明 |
---|---|
-t タイプ | 暗号化するタイプを指定(rsa1,rsa,dsa) |
-p | パスフレーズを変更 |
-f ファイル名 | 鍵ファイルを指定 |
-R ホスト名 | 指定されたホストの鍵をknow_hostsファイルから削除 |
公開鍵 | ファイル |
---|---|
自分の公開鍵 | ~/.ssh/id_[rsa1,rsa,dsa等].pub |
SSHクライアント側にある、サーバの公開鍵 | ~/.ssh/known_hosts |
SSHサーバ側にある、クライアントの公開鍵 | ~/.ssh/authorized_keys |
// 公開鍵認証の流れ // 1. 公開鍵と秘密鍵の鍵ペアを作成(クライアント側) [hoge@client ~]$ ssh-keygen -t rsa // 対話的に作成しパスフレーズを入力する // 「~/.ssh/id_rsa.pub」と「~/.ssh/id_rsa_key」が作成される // 2. 作成した公開鍵をサーバへscpで転送(クライアント側) [hoge@client ~]$ scp ~/.ssh/id_rsa.pub yourserver.com:publickey // 3. クライアントから送られた公開鍵をクライアント用の公開鍵に追記(サーバ側) [foo@yourserver.com]$ cat publickey >> ~/.ssh/authorized_keys // 4. クライアント用の公開鍵の権限を所有者のみ読み書き出来るよう変更する※1(サーバ側) [foo@yourserver.com]$ chmod 600 ~/.ssh/authorized_keys // 5. サーバへ公開鍵認証でログインできるようになる(クライアント側) [hoge@client ~]$ ssh foo@yourserver.com // 1.で作成したパスフレーズを入力してログイン // 毎回パスフレーズを入力したくなければ「ssh-agent」コマンドを実行すると省略できる // 6. 通常ログインでの接続を禁止する(鍵認証のみログイン可能にする) $ sudo vi /etc/ssh/sshd_config PasswordAuthentication no // 7. sshの再起動 // ubuntの場合 $ sudo /etc/init.d/ssh restart // centOS7の場合 $ sudo systemctl start sshd.service ※1. 所有者以外のユーザに書き込み権限を与えてしまうと、ユーザの把握しない鍵が勝手に登録され、ログインされてしまう可能性が生じる
SSHの活用
scpコマンドによるリモートファイルコピー
scp コピー元ファイル [ユーザー名@]コピー先ホスト:[コピー先ファイル名]
scp [ユーザー名@]コピー元ホスト:コピー元ファイル名 コピー先ファイル名
オプション | 説明 |
---|---|
-p | パーミッションなどを保持したままコピー |
-r | 再帰的にコピー |
GnuPGによる暗号化
- 「GnuPG」(GNU Privacy Guard)は、ファイルの暗号化と復号化をするためのソフトウェア
- 共通鍵暗号方式および公開鍵公開鍵暗号方式のどちらも使用できる
- 「~/.gnupg/」ディレクトリに設定ファイルが格納されている(~/.gnupg/pubring.qpgファイルは公開鍵キーリング(公開鍵や秘密鍵を保管する鍵用のファイル))
- 「gpg」コマンドで「鍵の作成」「公開鍵のエクスポート、インポート」「ファイルの暗号化、復号化」が出来る
gpg [コマンド] [オプション] [ファイル名や鍵ID等]
// 鍵の作成・確認・無効化の例) // 1. 公開鍵と秘密鍵の鍵ペアを作成 $ gpg --gen-key // 対話的に作成する(鍵の種類(RSAやRDA)?有効期限?ID?パスワード?などが聞かれる) // 2. 作成した公開鍵と秘密鍵の確認 $ gpg --list-keys // 「~/.gnupg/」以下に作成した「pubring.qpg」ファイルの有効期限等の情報が確認できる // 3. 鍵の失効証明書を作成(鍵の無効化。パスフレーズが漏れたり忘れた場合に実行する) $ gpg -o revoke.asc --gen-revoke hoge@examle.com // 対話的に作成する(失効理由?ID?パスフレーズ?などが聞かれる) // 4. 作成した失効証明書を安全な場所に保存 $ gpg --import revoke.asc
// 公開鍵のエクスポート、インポートの例) // 1. 公開鍵のエクスポート // 書式:gpg -o 出力ファイル名 -a --export 自分のメールアドレス $ gpg -o pubkey -a --export self@example.com // 1. 公開鍵のインポート gpg --import pubkey // インポートした公開鍵は「gpg --list-keys」コマンドで確認できる // 2. インポートした公開鍵に署名する(署名を行わないと毎回警告がでる) $ gpg --sign-key hoge@example.com // 対話的に署名する(本当に署名して良い?などが聞かれる)
// ファイルの暗号化、復号化 // 1. 暗号化:hoge@example.comのみが複合できるようimportant.txtを暗号化 // 書式:gpg -e -a -r 送り先のメールアドレス 暗号化するファイル名 $ gpg -e -a -r you@example.com important.txt // important.txt.ascが作成される // 2. 復号化:送られてきたimportant.txt.ascを秘密鍵を使って復号化 $ gpg important.txt.asc // 対話的に復号化する(パスフレーズ?を聞かれる)
おまけ
公開鍵暗号方式
- 南京錠を例にした秘密鍵と公開鍵のイメージ
- Aさんは、鍵の開いた南京錠を世界中に配布する(鍵は配布しない)
- Bさんは、Aさんの南京錠を受け取る
- Bさんは、自分の小包にその南京錠を使って鍵をかけAさんへ送る(Bさんは鍵がないので南京錠を開けられない)
- Aさんは、小包を受け取り南京錠を開錠し中身を取り出す
- 「鍵の開いた南京錠」→「公開鍵」
- 「南京錠を開錠する鍵」→「秘密鍵」
- 公開鍵暗号方式は、SSLやSSH等で使われる
- 共通暗号方式の場合、暗号化する際の「鍵」と復号化する際の「鍵」が同じ
SSLとSSHの違い
SSL | SSH | |
---|---|---|
OSI | 6.トランスポート層 | 7.アプリケーション層 |
公開鍵 | 証明書に署名した認証局の公開鍵(全ユーザ共通) | ユーザ毎の公開鍵 |
主な用途 | 任意のプロトコルをトンネリング、HTTPS接続等 | リモートシェル、Githubからcloneする(openssh)等 |
FTP | FTPS | SFTP |
備考 | 第3者にサーバの身元を証明してもらう(認証局から電子証明書(SSLサーバー証明書)を発行してもらう)、TLSの元になったプロトコルがSSLであり本来はTLSと呼ぶ | 秘密鍵と公開鍵を作り公開鍵をサーバへ渡す |