スーパーサーバ
他のサーバプログラムに代わってサービス要求を監視し、接続が確立した時点で本来のサーバプログラムに要求を引き渡す。必要な時だけ個々のサーバプログラムを起動することで、メモリなどのシステムリソースを効率的に使うことができ、利用頻度の低いサービス(例えばTELNETやFTPなど)をシステムにデーモンとして常駐させる必要が無くなり、メモリやCPU等のリソースの消費を抑えられる。
デメリットは、応答が遅れること。
アクセス制御には「TCPラッパー」を利用する
利用頻度の高いサービス(HTTPなど)は、スーパーサーバを経由せず、システムにデーモンを常駐させておいた方が効率的
xinetd
たいていのディストリビューションで採用されているスーパーサーバ。全体的な設定は/etc/xinetd.conf
ファイルで行い、各サービスの個別設定は/etc/xinetd.d
ディレクトリ内の設定ファイルで行う。設定を変更した場合は再起動が必要。
/etc/xinetd.conf
のパラメータ
パラメータ | 説明 |
---|---|
bindまたはinterface | サービスを提供するインターフェースのIPアドレス |
instances | 各サービスの最大デーモン数 |
log_type | ログの出力方法。syslogや記録するログファイルの絶対パスを指定する |
log_on_success | 接続を許可したときにログを記録する内容 |
log_on_failure | 接続を許可したときにログに記録する内容 |
cps | 1秒間に接続できる最大コネクション数と、限度に達した場合にサービスを休止させる秒数 |
includedir | サービスごとの設定ファイルを収めるディレクトリ |
/etc/xinetd.d
ディレクトリ以下のファイルのパラメータ
パラメータ | 説明 |
---|---|
disable | サービスの有効/無効。利用したくない場合はyesと記述する。 |
socket_type | 通信のタイプ。ストリーム型、データグラム型といったサービスの接続タイプとあり、TCPはstream、UDPはdgram |
wait | サーバプログラムへの接続処理を待ち合わせるかの設定をする。サーバプログラムがマルチスレッドであり1プロセスで同時に複数処理できる場合はno、シングルスレッドで処理が完了しサーバプログラムが終了するまで接続処理を待ち合わせる必要がある場合はyesとする。 |
user | サービスを実行するユーザー名 |
server | サーバプログラム(デーモン)へのフルパス |
server_args | サーバプログラム(デーモン)に渡す引数 |
log_on_failure | 接続を拒否したときにログに記録する内容 |
nice | 実行優先度 |
only_from | 接続を許可する接続元 |
no_access | 接続を拒否する接続元 |
access_times | アクセスを許可する時間帯 |
socketユニット
systemdの動作するシステムでは、特定のサービス宛のネットワーク接続を監視する「socketユニット」がスーパーサーバの代わりに使える。socketユニットの定義ファイルでは待ち受けるIPアドレスとポート番号を指定し、接続があったら対応するserviceユニットを起動してリクエストに応答する。
TCP Wrapper
書式:サービス名:対象ホストのリスト
ネットワークサービスのアクセス制御を集中的に行う際に使用するセキュリティソフトウェア。tcpdデーモンがtelnetdやftpdなどのサーバプログラムに代わってサービス要求を受け取った後、設定に基づいてチェックを行い、接続が許可された場合はそれぞれのサーバプログラムに処理を引き渡す。設定ファイルは、/etc/hosts.allow
と/etc/hosts.deny
変更した場合直ちに反映され、該当サービスへの新たなアクセスから適用される
- /etc/hosts.allowファイルがあれば、アクセスを許可する。
- /etc/hosts.allowファイルがなければ、/etc/hosts.denyを参照し、そこに記述のないユーザが利用可能
- 両方のファイルに記載のないホストは全て許可する
ワイルドカード | 説明 |
---|---|
ALL | 全てのサービスもしくはホスト |
A EXCEPT B | B以外のA |
LOCAL | 「.」を含まない全てのホスト |
PARANOID | クライアントのIPアドレスから逆引きしたホスト名と、そのホスト名を正引きしたIPアドレスが一致することを確認する |
ポートの確認
開いているポートは最小限にとどめなけらばならない。攻撃者がネットワーク経由で開いているポートを確認することをポートスキャンという。
#ポートの確認方法
$ netstat -atu
$ ss -atu
$lsof -i
lsofコマンド
書式:lsof [オプション] パス名
現在開いているファイルを一覧表示するコマンド。調査対象にしたいファイルが決まっている場合は引数で指定する。
オプション | 説明 |
---|---|
-i | ネットワークソケットを対象にする。[-i:ポート番号]で指定が可能 |
表示項目 | 説明 |
---|---|
COMMAND | ファイルを開いているプロセスのコマンド名 |
PID | プロセスのPID |
USER | ユーザー名 |
FD | ファイルディスクリプタ |
TYPE | 種類 |
DEVICE | デバイス |
SIZE/OFF | ファイルサイズまたはオフセット |
NODE | iノード番号 |
NAME | ファイル名 |
nmapコマンド
書式:nmap 対象ホスト
指定したホストの開いているポートをネットワーク経由で確認(ポートスキャン)するコマンド。ホストにログインせずに、外部からアクセス可能なポートを調査できる
自身の管理下にない外部サーバに対して、むやみにポートスキャンをすると攻撃準備とみなされる可能性があるためやらないようにする
$ nmap 192.168.1.1
Starting Nmap 6.49BETA2 ( http://nmap.org )
Nmap scan report for 192.168.1.1
Host is up (0.00083s latency).
Not shown: 998 filtered ports
PORT STATE SERVICE
80/tcp open http
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 5.08 seconds
fuserコマンド
書式:fuser [オプション] 検索対象
システムの特定のリソースを使用中のプロセスを検索し、強制終了することのできるコマンド
オプション | 説明 |
---|---|
-k(kill) | プロセスにSIGKILLを送信。送りたいシグナルを指定するには[-シグナル名]とする |
-m(mount) | マウントされたファイルシステムを指定 |
-n(namespace) | 検索する領域(名前空間)を指定。file(ファイル名:デフォルト),updz(UDPポート番号),tcp(TCPポート番号)が指定できる |
-u(user) | 検索結果にユーザー名を追加 |
-v(verbose) | 詳細な情報を表示 |
ログイン管理
whoコマンド
誰がログインしているかを調べることできるコマンド。/var/run/utmp
を参照に調べている。
wコマンド
現在マシンにいるユーザーとその人のプロセスについての情報を表示するコマンド。/var/run/utmp
を参照に調べている。
ログイン名、端末名、リモートホスト名、ログイン時刻、アイドル時間、 JCPU, PCPU, ユーザーのカレントプロセスのコマンドラインが表示される。
lastコマンド
最近ログインしたユーザの一覧を表示するコマンド。/var/log/wtmp
ファイルは、ユーザのログイン/ログアウト情報が記録されているバイナリファイルで、このファイルを参照し表示する。
パスワード管理
chageコマンド
書式:chage [オプション(引数)] ユーザー名
CHange password AGEの略。アカウント失効日の設定と表示するコマンド。オプションなしに実行すると。対話モードになる。
[-l]オプション以外のオプションは、rootユーザーしか実行できない
オプション | 説明 |
---|---|
-l(list) | アカウントとパスワードの失効日の情報を表示。このオプションのみ一般ユーザーでも使用可 |
-d(lastday) | パスワードの最終更新日を設定。年月日をYYYY-MM-DDの書式、もしくは1970年1月1日からの日数で指定する |
-m(mindays) | パスワード変更間隔の最短日数を設定。0に設定することでいつでもパスワードを変更することが可能になる。 |
-M(maxdays) | パスワードを変更なしで使用できる最長日数を設定。0に設定することでいつでも変更することができる(デフォルト) |
-W(warndays) | パスワードの変更期限の何日前から警告を出すかを指定 |
-I(inactive) | パスワードの変更期限を過ぎてからアカウントが使用できなくなるまでの猶予日数。この猶予期間ではログイン時にパスワードの変更を要求される |
-E(expiredate) | アカウントの失効日を設定(失効日の翌日から使用不可になる)。年月日をYYYY-MM-DDの書式、もしくは1970年1月1日からの日数で指定する |
##ユーザ「user1」のパスワードをいつでも変更できるようにする
# chage -m 0 user1
##「user1」のユーザアカウントの有効期限を「2010年4月20日」までにする
# chage -E 2010-04-20 user1
/etc/nologinファイル
作成しておくことで、rootアカウントによるログイン以外は禁止することが出来る。このファイルがある状態でログインを試みると、/etc/nologinに記述された内容と「Login incorrect」というメッセージが表示される。
suコマンド
書式:su [-[ユーザー名]]
一時的に別のユーザーになることが出来るコマンド。パスワードを求められるので、指定したユーザーのパスワードを入力する必要がある。exitコマンドで元に戻る。
[-]を付けると、切り替わる先のユーザーの環境変数を使用することが出来る。ユーザー名を指定しない場合は、rootユーザーに切り替わる。
rootユーザーから別のユーザーに切り替わるときはパスワードは要求されない
sudoコマンド
書式:sudo [オプション] コマンド
特定の管理者コマンドのみの実行を許可することが出来るコマンド。利用するには引数として、実行したいコマンドを指定する。実行しているユーザーのパスワードを入力するとコマンドが実行され、しばらくパスワードの入力なしで実行可能になる。
オプション | 説明 |
---|---|
-l | 許可されているコマンドを表示する |
-i | 変更先ユーザーでシェルを起動する(ログイン時の処理を行う) |
-s | 変更先ユーザーでシェルを起動する |
-U | rootではなく指定したユーザーでコマンドを実行する |
visudoコマンド
設定書式:ユーザー名 ホスト名=(実行ユーザー名)[NOPASSWD:]コマンド
rootユーザーでsudoコマンドの利用設定をすることが出来る。デフォルトのエディタで/etc/sudoers
ファイルが開かれる。一般ユーザーでは開けない。
項目 | 説明 |
---|---|
ユーザー名 | コマンドの実行を許可するユーザー名か、グループ名、もしくはALL |
ホスト名 | 実行を許可するホスト名か、IPアドレス、もしくはALL |
実行ユーザー名 | コマンド実行時のユーザー名(省略時はroot)、もしくはALL |
コマンド | 実行を許可するコマンドのパス、もしくはALL |
NOPASSWD: | 指定すると、コマンド実行時にパスワードを問われない |
#studentユーザーにシャットダウンコマンドを実行できるようにする
student ALL=(ALL) /sbin/shutdown
システムリソースの制限
SUID/SGIDの実行管理
書式:find [検索場所] -perm -[モード]
書式:find [検索場所] -perm +[モード]
SUIDやSGIDが設定されていると、一般ユーザーでもroot権限でファイルを実行でき、root権限を不正に操作されるとセキュリティ上問題がある。不用意にSUID・SGIDを設定してしまうと、そのファイルを利用して、rootユーザーしか許可されない操作を一般ユーザーが行ってしまう可能性があるので、システムの管理者は、findコマンドを利用し把握するようにしている。
##SUID,SGIDのいずれかが設定されているか調べる場合
$ find / -perm -6000
##SUID,SGIDの両方設定されているか調べる場合
$ find / -perm +6000
##SUIDが設定されているファイルを全ファイルシステムから検索する場合
# find / -perm -u+s -ls
[-u+s]の代わりに、[-g+s],[-o+s]などと指定すると、SGID、スティッキービットが設定されているファイルを探すことも可能になる。
ulimitコマンド
書式:ulimit [オプション[リミット]]
ユーザーが利用できるリソースを制限することが出来るコマンド。
オプション | 説明 |
---|---|
-a | 制限の設定値をすべて表示する |
-c サイズ | 生成されるコアファイルのサイズを指定する |
-f サイズ | シェルが生成できるファイルの最大サイズをブロック単位で指定する |
-n 数 | 同時に開くことのできるファイルの最大数 |
-u プロセス数 | 1人のユーザーが利用できる最大プロセス数を指定する |
-v サイズ | シェルとその子プロセスが利用できる最大仮想メモリサイズを指定する |
OpenSSH
ほとんどのディストリビューションでパッケージが用意されており、インストールするとホストの公開鍵と秘密鍵が作成される。これらのファイルはホスト認証に使われる。
SSHサーバの機能はsshdデーモンが/etc/ssh/sshd_config
が提供し、/etc/ssh/ssh_config
設定ファイルになる。
設定項目 | 説明 |
---|---|
Port | SSHで使うポート番号(デフォルトは22) |
Protocol | SSHのバージョン(1と2) |
HostKey | ホストの秘密鍵 |
PermitRootLogin | rootでもログインを許可するかどうか |
RSAAuthentication | SSHバージョン1での公開鍵認証を使用するかどうか |
PubkeyAuthentication | SSHバージョン2での公開鍵認証を使用するかどうか |
AuthorizedKeysFile | 公開鍵が格納されるファイル名 |
PermitEmptyPasswords | 空のパスワードを許可するかどうか |
PasswordAuthentication | パスワード認証を許可するかどうか |
X11Forwarding | X11転送を許可するかどうか |
#SysVinitを採用したRedHat系でsshdを起動する場合
# /etc/init.d/sshd start
#SysVinitを採用したDebian系でsshdを起動する場合
# /etc/init.d/ssh start
#systemdを採用したsshdを起動する場合
# systemctl start sshd.service
sshコマンド
書式:ssh [オプション] ログインユーザー名@ ホスト
SSHを使ってリモートログインをするコマンド。引数にはホスト名かIPアドレスを指定する。
telnetと比較すると、通信経路が暗号化されるため盗聴に対する安全性が高まる。
鍵のデフォルトの保存先は~/.ssh
ディレクトリとなり、sshコマンドで接続時に秘密鍵ファイルを指定しないと~/.ssh
配下の秘密鍵がユーザ認証で使用される。
オプション | 説明 |
---|---|
-p ポート番号 | 接続先ポート番号を指定する |
-l ユーザー名 | ログインユーザー名を指定する |
-i ファイル名 | 秘密鍵ファイルを指定する。~/.ssh 以外の場所にある秘密鍵を認証で使用したい場合に有効 |
-o 設定パラメータ | 設定パラメータを指定する |
-X | X11のポートフォワーディングを有効にする(リモートマシンのXアプリケーションが実行できるようになる) |
-L | Local port forwardingの略で、SSHポートフォワーディングを使って、ローカルのポートに接続するとSSHサーバ内のWebサーバに接続するようにトンネルを用意する |
##ホストserverにユーザuserでログインする
# ssh user@sever
# ssh -l user
# ssh -o User=user server
##ローカルのポート8000への接続は、SSHサーバ自身(localhost)のポート80(Webサーバ)へ転送する
# ssh -L 8000:localhost:80 user@ssh-server
##公開鍵方式のユーザ認証に使用する秘密鍵のファイルを指定する
# ssh -o IdentityFile 秘密鍵ファイル
# ssh -i 秘密鍵ファイル
ポート転送(ポートフォワーディング)
書式:ssh-L [ローカルポート]:[リモートホスト]:[リモートポート] [リモートホストのユーザー名]@[リモートホスト]
あるポートに送られてきたTCPパケットを、SSHを使った安全な通信路を経由して、リモートホストの任意のポートに転送すること。
X11ポート転送
リモートホストのXクライアントをローカルホストで動作させること。/etc/ssh/sshd_comfig
以下に設定し有効にする必要がある。
認証方法
ユーザ認証(認証方式:ID/パスワード方式、もしくは公開鍵方式)
SSHクライアントで接続してくるユーザが正当なユーザかどうかを確認する認証方法。
SSHクライアントで接続してくるユーザが正当なユーザかどうかを確認するために行う。ローカルでのログインと同様のID/パスワード方式と公開鍵方式の2種類ある。
公開鍵方式を使用する場合は一対の公開鍵と秘密鍵を作成する必要がある。作成したユーザ公開鍵をサーバに登録しておき、サーバは登録した公開鍵とユーザの秘密鍵のペアが一致したらログインさせる。一致しなければログインできない。これによりID/パスワード方式よりもセキュリティ上強固なユーザ認証を実現する。
ユーザ認証で公開鍵方式を使う場合、ssh-keygenコマンドで公開鍵/秘密鍵のペアを作成し、そのうち公開鍵「~/.ssh/id_rsa.pub」(デフォルト)をサーバの認証鍵リスト~/.ssh/authorized_keys
に登録しておく。
ホスト認証(認証方式:公開鍵方式)
接続先のSSHサーバが正しいホストかどうかを確認する認証方法。ユーザーとパスワードによるユーザー認証に先立って、クライアントがサーバの正当性を確認する認証が行われる。接続するたびにサーバ固有のホスト認証(公開鍵)がサーバからクライアントに送られ、クライアントは登録した公開鍵とサーバの公開鍵が一致したらログインする
初回接続時に限っては、接続先サーバの公開鍵を持っていないので比較しようがない。
初回接続をすると、サーバの公開鍵/etc/ssh_host_rsa_key.pub
(デフォルト)を、クライアントの認証鍵リスト~/.ssh/known_hosts
ファイルに登録される。
公開鍵認証
通信を行うホスト間で、一対の公開鍵と秘密鍵のペアを使って認証を行う。公開鍵認証を行うには、あらかじめクライアント側ユーザーの公開鍵をサーバに登録しておく必要がある。ユーザの公開鍵は「id_<鍵の種類>.pub」
ssh-keygenコマンド
書式:ssh-keygen [オプション]
公開鍵と秘密鍵の鍵ペアを作成するコマンド。作成する際、秘密鍵を利用する際の認証文字列であるパスフレーズが求められる。文字数の制限はなく、長ければ長いほどセキュリティ面が向上する。
オプション | 説明 |
---|---|
-t タイプ | 暗号化タイプ(rsa1,rsa,dsa,ecdsa,ed25519)を指定する |
-p | パスフレーズを変更する |
-f ファイル名 | 鍵ファイルを指定する |
-R ホスト名 | 指定されたホストの鍵をknown_hostsファイルから削除する |
-b ビット長 | 鍵の長さをビット長で指定する |
[-t]オプションで生成できる暗号方式と鍵のデフォルトのファイル名は以下の通りになる
暗号方式 | 鍵 | SSHクライアント(~/.ssh 配下) |
SSHサーバ(/etc/ssh 配下) |
---|---|---|---|
rsa | 秘密鍵 | id_rsa | ssh_host_rsa_key |
rsa | 公開鍵 | id_rsa.pub | ssh_host_rsa_key.pub |
dsa | 秘密鍵 | id_dsa | ssh_host_dsa_key |
dsa | 公開鍵 | id_dsa.pub | ssh_host_dsa_key.pub |
ecdsa | 秘密鍵 | id_ecdsa | ssh_host_ecdsa_key |
ecdsa | 公開鍵 | id_ecdsa.pub | ssh_host_ecdsa_key.pub |
ed25519 | 秘密鍵 | id_ed25519 | ssh_host_ed25519_key |
ed25519 | 公開鍵 | id_ed25519.pub | ssh_host_ed25519_key.pub |
ssh-agent
メモリ上に秘密鍵を保管しておく認証エージェントのこと。キーペアを作成時にパスフレーズを設定している場合、パスフレーズ付きの秘密鍵を使ってSSH接続する際に毎回パスフレーズを入力しないで済むようになる。
起動直後は鍵情報が登録されていないので、ssh-addコマンドで秘密鍵とペアになるパスフレーズを入力して鍵情報を登録する、これ以降は登録した秘密鍵を使用したSSH接続時にパスフレーズの入力が求められなくなる。
ssh-agent bashコマンドでbashを起動し、バックグラウンドで動作する。
scpコマンド
リモートホストへの書式:scp コピー元ファイル [ユーザー名@] コピー先ホスト:[コピー先ファイル名]
ローカルホストへの書式:scp [ユーザー名@] コピー元ホスト:コピー元ファイル コピー先ファイル名
サーバ側に鍵ファイルを転送するコマンド。作成した鍵は、~/.ssh/authorized_keys
ファイルに追加される。
オプション | 説明 |
---|---|
-p | パーミッションなどを保持したままコピーする |
-r | ディレクトリ内を再帰的にコピーする |
-P ポート番号 | ポート番号を指定する |
ssh-addコマンド
秘密鍵を登録するコマンド。
ファイルの暗号化
ファイルを暗号化する場合、LinuxではGnuPG(GNU Privacy Guard)が利用可能。GnuPGは公開鍵暗号を使って、ファイルを暗号化・復号したり、電子署名をしたりすることのできるOSSのこと。
公開鍵暗号方式
公開鍵を使って暗号化したものをペアとなる秘密鍵で復号する。
送信者は暗号化ファイルを送りたい相手の公開鍵でファイルを暗号化して相手に送る。暗号化ファイルを受け取った受信者は、自身の秘密鍵で復号を行う。正しい鍵ペアの場合のみ復号ができ、送信者も受信者も安全にデータの受け渡しができる。
秘密鍵は絶対に他人に知られてはならない!知られた場合作成しなおさなければならない
共通鍵暗号方式
暗号化と復号に共通の鍵を用いる。
処理が早く簡単だが、複数の相手に同じ共通鍵を使用すると他の人のデータも復号できてしまうので、データを送信する相手ごとに鍵を作成した方がよい。
gpgコマンド
ファイル暗号化のための公開鍵と秘密鍵の鍵ペアを作成するコマンド。~/.gnupg
ディレクトリが作成され、公開鍵のキーリングと秘密鍵のキーリングが作成される。
パスフレーズが漏れてしまったり、忘れてしまった場合は鍵を無効化する失効証明書を作成することが出来る。
オプションなしで実行すると、元のファイルに戻す(復号する)ことが出来る。
オプション | 説明 |
---|---|
--gen-key | 公開鍵暗号方式の鍵ペアを生成する |
--export | 公開鍵をエクスポートする |
--import | 公開鍵をインポートする |
--list-keys | 公開鍵を一覧表示する |
--sign | ファイルに署名する |
--verify | ファイルの署名を検証する |
-c | ファイルを共通鍵で作成 |
-e ファイル名 | 暗号化データを受け取る側の公開鍵を使用してファイルを暗号化する |
-o ファイル名 | 出力ファイル名を指定する |
-r メールアドレス | 暗号化に使用する公開鍵の持ち主のメールアドレスを指定する |
#鍵の失効証明書を作成する
$ gpg -o 失効証明書ファイル名 --gen-revoke メールアドレス
#公開鍵をファイルにエクスポートする
$ gpg -o 出力ファイル -a --ezport 自分のメールアドレス
#ファイルを暗号化する
$ gpg -e -a -r 送り先のメールアドレス 暗号化するファイル
gpg-agentというデーモンプログラムが、秘密鍵を管理しパスフレーズによる認証状態を一時期間キャッシュする