OpenSSH
SSHとは、ネットワークを介して安全な通信を行うためのプロトコル。強力な認証機能と暗号化により、ファイル転送やリモート操作を安全に行うことができる。
SSHの認証手順
- ホスト認証
- ユーザー認証
- 公開鍵認証
- パスワード認証
ユーザー認証
ユーザー認証方法は複数用意されている。代表的なものは
- 公開鍵認証
- パスワード認証
公開鍵認証は公開鍵暗号方式を利用してユーザーを認証する。公開鍵認証を行うには、サーバ側にあらかじめ公開鍵を登録しておく必要がある。
SSHサーバの設定
Linux ではオープンソースのソフトウェア、OpenSSH が採用されている
OpenSSH を利用するのに必要なパッケージ
- openSSH
- openssh-server
- openssh-client
- openssl
- openssh-askpass (必須ではない)
- openssh-askpass-gnome (必須ではない)
SSHサーバの設定ファイル
- /etc/ssh/sshd_config
デフォルトのままでも利用可能。安全性をさらに高める、設定変更するとき用に
Protocol
デフォルトでは、SSH バージョン1、 SSH バージョン2 両方のプロトコルを扱う。クライアント側がバージョン2に対応しているのであれば、「Protocol 2」としておくのが吉
Protocol 2
PermitRootLogin
root ユーザーによるログインを許可するかどうかを指定する。万が一 root パスが推測された場合、ログインを許してしまうことになるため、「PermitRootLogin no」としておくのが安全
#PermitRootLogin yes
PermitEmptyPasswords
パスワード認証を許可している場合、空パスワードを許可するかどうかを指定する。セキュリティを高めるため「PermitEmptyPasswords no」としておくのが無難
#PermitEmptyPasswords no
PasswordAuthentication
パスワード認証を許可するかどうかを指定する。公開鍵認証の設定が完了すればパスワード認証は必要ないため、設定完了後に「PasswordAuthentication no」とするとセキュリティあっぷ
PasswordAuthentication yes
SSH クライアントの利用方法
SSHクライアントコマンドは、openssh-client パッケージに含まれている。
主なコマンド
ssh | telnet の代替コマンドとして利用できる |
scp | ファイルコピーを行う |
ssh コマンド
ssh ユーザー名@ホスト名 or IPアドレス
例)ホスト「host」に、ユーザー「hoge」としてログイン
ssh hoge@host
初回接続時、SSHサーバからホスト認証鍵が送られてくるので、受け入れる場合は「yes」と入力。次にパスワードを入力するとログインが完了する。ホスト認証鍵はユーザーの 「 ~/.ssh/known_hosts 」 ファイルに格納される。
※ ホスト認証鍵のバックアップなしでサーバを再インストールした場合、初回起動時にホスト認証鍵が自動的に生成される。新たなホスト認証鍵は以前のものとは異なるため、そのままでは警告が出る。このような場合、「 ~/.ssh/known_hosts 」 ファイル内の該当エントリを削除すれば解決する
公開鍵認証の利用
公開鍵認証を使うと、パスワードを使わないでログインできる。その代わり、正当な秘密鍵と、秘密鍵を利用するためのパスフレーズを使う。公開鍵認証を利用するには、まず公開鍵と秘密鍵の鍵ペアを作成する必要がある。
鍵ペアの作成
ssh-keygen オプション
公開鍵と秘密鍵は、SSH のバージョンと暗号化アルゴリズムによる複数の種類がある
SSH の鍵ファイル
SSH バージョン | 秘密鍵ファイル | 公開鍵ファイル | ssh-keygen コマンドのオプション |
---|---|---|---|
バージョン1 | identity | identity.pub | -t rsa1 |
バージョン2 (RSA) | id_rsa | id_rsa.pub | -t rsa |
バージョン2 (DSA) | id_dsa | id_dsa.pub | -t dsa |
例) バージョン2 (DSA) の鍵ペア作成
ssh-keygen -t dsa
- 鍵ファイルの名前を指定
通常はデフォルトでOKなのでそのまま [Enter] キーを押せばOK - パスフレーズの入力
秘密鍵を使う時に求められるパスフレーズを2度入力する。パスワードよりも長い、空白を含めた文字列の指定が可能。 [Enter] キーのみを押すと空のパスフレーズが作成される。
鍵ペアは、「 ~/.ssh 」ディレクトリ以下に作成される
Webサーバ
Webサーバは、HTMLや画像などの情報をサーバにストックし、クライアントからの要求があると、ネットワーク経由で要求された情報をクライアントに送信する
現在、Webサーバで最も人気が高いサーバは、Apache
Webサーバの仕組み
Webサーバとクライアントとの間の通信は、HTTP (Hyper Text Transfer Protocol) と呼ばれるプロトコルによって行われる。その為、WebサーバはHTTPサーバとも呼ばれる。
- WebブラウザからWebサーバにリクエストを送信する
- WebサーバはWebブラウザのリクエストした処理を返す(レスポンス)
WebブラウザからWebサーバへ送られるHTTPリクエスト
メソッド リクエスト URL HTTPバージョン
例)Webサーバに接続し、index.html ファイルを取得したい場合
GET /index.html HTTP/1.1
上記に対するレスポンス
HTTP/1.1 200 OK Date: Wed, 3 Aug 2005 01:18:40 GMT Server: Apache/2.0.52 (CentOS) Last-Modified: Wed, 3 Aug 2005 01:18:30 GMT ETag: "85105-27-d47f4b80" Accept-Ranges: bytes Content-Length: 39 Connection: close Content-Type: text/html <html><body> Hello World! </body></html>
前半をレスポンスヘッダ、後半をレスポンスボディと呼ぶ。レスポンスヘッダにはサーバからの情報が、レスポンスボディにはコンテンツ(HTMLデータや画像データなど)が含まれている。レスポンスヘッダ1行目にある数字は状態を表すステータスコード。
コード | 内容 |
---|---|
1xx | インフォメーション (Information) |
100 | リクエスト継続してもよい (Continue) |
2xx | 正常終了 (Success) |
200 | リクエスト成功 (OK) |
3xx | リダイレクト (Redirection) |
4xx | クライアントエラー (Client Error) |
400 | 不正なリクエスト (Bad Request) |
403 | アクセス拒否 (Forbidden) |
404 | ページが存在しない (Not Found) |
5xx | サーバエラー (Server Error) |
500 | スクリプトエラーなどのサーバ内部エラー (Internal Server Error) |
HTTPメソッド
メソッド | 内容 |
---|---|
GET | 指定した URL のリソース (HTMLファイル、画像、プログラムの実行結果など)を取得する |
HEAD | 指定した URL からレスポンスヘッダのみを取得する |
POST | 指定した URL へデータを送信し処理を要求する |
PUT | 指定した URL へデータを送信し保存を要求する |
DELETE | 指定した URL のリソース削除を要求する |
CGI, PHPを利用する方法
CGI、PHPを利用する設定
CGI (Common Gateway Interface) とは、Webサーバから外部のプログラムを呼び出す仕組み。CGIを使うと何が違うのか
びふぉあ
リクエストに応じてあらかじめ用意されている HTMLファイルを返す
表示される内容は常に一定
あふたー
Perl や C言語などで記述された外部プログラムを実行し、その実行によって生成された HTML などをレスポンスメッセージとして返す。
動的な Webページを作ることが可能に!すごいぞ CGI!
CGI を利用する
CGI を利用するためには mod_cgi モジュールがロードされている必要がある。また httpd.conf ファイルで次のような設定が必要になる。設定方法は2種類。
- ScriptAlias ディレクティブで指定する
- 特定のディレクトリ以下を Options で指定する
ScriptAlias で指定
デフォルトで設定されている方法。特定のディレクトリ以下へのリクエストがあった場合、CGI とみなしてそれが実行される。
デフォルトの ScriptAlias ディレクティブ
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
PHP を利用する
PHP はデフォルトで利用できる設定になっている。動作しない場合、/etc/httpd/conf.d/php.conf をチェックする
<IfModule prefork.c> LoadModule php5_module modules/libphp5.so </IfModule> <IfModule worker.c> LoadModule php5_module modules/libphp5-zts.so </IfModule> AddHandler php5-script .php AddType text/html .php DirectoryIndex index.php
基本認証 (BASIC認証)
基本認証 (BASIC認証) を使うと正しい ユーザー名/パスワード を入力しなければ見ることのできないディレクトリを設定できる。基本認証の設定は、2種類。
毎度おなじみ .htaccess 過去何度似たようなことで詰まったか・・・ (:D)rz
httpd.conf に設定する方法
httpd.conf の Section2 に記述を追加する
<Directory "/var/www/html/hoge"> AuthType Basic AuthName "Please Enter Your ID and Pass" AuthUserFile /etc/httpd/conf/.htpasswd_hoge AuthGroupFile /dev/null Require valid-user </Directory>
- AuthType には「Basic」を指定
(基本認証の他にダイジェスト認証なるものもあるらしい) - AuthName には認証時に表示されるメッセージを指定
- AuthUserFile には認証情報が格納された任意のファイル名をそれぞれ指定
- Require valid-user と指定すると、認証情報ファイルに登録されたすべてのユーザーが許可対象になる
.htaccess ファイルを用意する方法
AuthType Basic AuthName "Please Enter Your ID and Pass" AuthUserFile /etc/httpd/conf/.htpasswd_hoge AuthGroupFIle /dev/null Require valid-user
httpd.conf に記述を追加
- httpd.conf
<Directory "var/www/html/hoge"> AllowOverride AuthConfig </Directory>
ユーザーの作成とパスワード設定
認証時に使用するユーザーとパスワードを設定するには htpasswd コマンドを使う
htpasswd -c ファイル名 ユーザー名
オプション | 内容 |
---|---|
-c | 新規ファイル作成 |
-b | 入力プロンプトを出さずにコマンドライン上でパスワードを設定 |
-m | パスワードを md5暗号化 |
-d | パスワードを CRYPT暗号化(デフォルト) ※ CRYPT暗号化の場合、最初の8文字しか使わない |
-P | パスワードを暗号化しない |
-D | (Delete) 指定したユーザーを削除 |
-n | 実行結果を表示する。ファイルは作成されない htpasswd -n ユーザー名 のようにファイルパスは省略する |
-s | パスワードを SHA暗号化 |
Apache Web サーバ
Apache Web サーバは、現在最も広く使われている Webサーバであり、2013年5月現在でのシェアは約53%となっている
参照:Web Server Survey | Netcraft
Apache のモジュール
モジュールとは、Apache にさまざまな機能を提供するプログラム部品。必要に応じて Apache の機能を柔軟に構成できるようになっている。
参照:Module Index - Apache HTTP Server
Apache の設定
Apache の設定は /etc/httpd/conf/httpd.conf を中心とした設定ファイルで行う。設定終了後は Apache を再起動させる必要あり。
Apache を起動したり、終了したりするには2種類
- 制御スクリプト /etc/init.d/httpd
- service コマンド
引数 | 内容 |
---|---|
start | 起動 |
stop | 停止 |
restart | 再起動 |
reload | 再読み込み |
graceful | 安全な再起動 |
configtest | 構文チェック |
基本的な設定
Apache の主要な設定ファイルは /etc/httpd/conf/httpd.conf 。それ以外にも /etc/httpd/conf.d/ ディレクトリ以下に補助的な設定ファイルがある。 /etc/httpd/conf.d/ ディレクトリ以下の設定ファイルは、httpd.conf 内に読み込まれて利用される
Apache の設定ファイル
ファイル | 内容 |
---|---|
/etc/httpd/conf/httpd.conf | 主要な設定 |
/etc/httpd/conf/magic.conf | MIMEタイプの設定 |
/etc/httpd/conf.d/manual.conf | オンラインマニュアルの設定 |
/etc/httpd/conf.d/perl.conf | スクリプト言語 Perl を利用するための設定 |
/etc/httpd/conf.d/php.conf | スクリプト言語 PHP を利用するための設定 |
/etc/httpd/conf.d/python.conf | スクリプト言語 Python を利用するための設定 |
/etc/httpd/conf.d/ssl.conf | SSL を利用するための設定 |
/etc/httpd/conf.d/webalizer.conf | アクセス解析ツール Webalizer の設定 |
/etc/httpd/conf.d/welcome.conf | デフォルトページの設定 |
httpd.conf の設定項目
httpd.conf は3つのパートから構成されている
- Section1 : Grobal Environment (サーバ自体の全般設定)
- Section2 : 'Main' Server configuration (メインの Webサーバの設定)
- Section3 : Virtual Hosts (バーチャルホストの設定)
httpd.conf の設定項目はディレクティブと呼ばれ、記述形式は
ディレクティブ名 設定値
タグを使って範囲を指定することもできる。
- Directory タグは設定が有効なディレクトリ単位の指定
- Files タグはファイル単位での指定
- Location タグは URL 単位での指定
※ Directory タグや Files タグでは、ドキュメントルートとは無関係に、ファイルやディレクトリのフルパスで指定する。また、「*」、「?」などのメタキャラクタが利用できる。
<Directory ディレクトリ名> ~ </Directory> <Directory hoge/> ~ </Directory>
レスポンスヘッダ内に含める情報の指定
ServerTokens OS
サーバ名やバージョンが特定されると、クラッカーが攻撃ツールを選定しやすくなるため、バージョン番号を表示させない方が安心感あっぷ。この場合「Prod」
設定値 | 表示例 |
---|---|
Prod | Server: Apache |
Major | Server: Apache/2 |
Minor | Server: Apache/2.0 |
Min | Apache/2.0.52 |
OS | Apache/2.0.52 (CentOS) |
Full | Apache/2.0.52 (CentOS) PHP/4.4.3 |
KeepAlive の有効/無効の指定
KeepAlive を有効にすると、1回のTCPセッションで複数のHTTPリクエスト/レスポンスを処理する。これによって、大量の画像を用いているページなどの表示が速くなる。KeepAliveRequests は1つのキープアライブで処理する最大数を、KeepAliveTimeout はキープアアライブのタイム後時間(秒)を指定する。
KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15
Apache の子プロセスの設定
バージョン2.0以降の Apache は複数の実装を持つ。 mpm-prefork は旧来の Apache と同様の実装。このタグ内では、 Apache の子プロセスの設定を行う。Apache は 80番ポートでリクエストを受け付ける親プロセス (root ユーザー権限で実行) と、個々のクライアントに応答する子プロセス (User ディレクティブで指定したユーザー権限で実行)から構成される。
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule>
StartServers | Apache 起動時にスタートする子プロセス数を指定 |
MinSpareServers | 待機している子プロセスの最少数を指定 |
MaxSpareServers | 待機している子プロセスの最大数を指定 |
ServerLimit | MaxClients で設定可能なサーバプロセス数の上限を指定 |
MaxClients | 子プロセスの最大数を指定 |
MaxRequestPerChild | 個々の子プロセスが処理することのできるリクエストの制限数を指定 |
サーバが待ち受けるポートの設定
サーバが待ち受けるポート番号を指定する。Webサーバは通常80番ポートを利用する。
Listen 80
起動時に読み込むモジュールの設定
起動時に読み込むモジュールを指定する。モジュールは /etc/httpd/modules/ ディレクトリ以下に格納されている。
LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule auth_digest_module modules/mod_auth_digest.so etc...
サーバ管理者のメールアドレスの指定
ServerAdmin riceplanting@www.hogehoge.com
ホスト名とポート番号の指定
ServerName www.hogehoge.com:80
ディレクトリ以下の設定
Options FollowSymLinks はシンボリックリンクをたどることを許可する。
AllowOverride None は、.htaccess ファイルによる設定の上書きを抑制する
<Directory "/"> Options FollowSymLinks AllowOverride None </Directory>
hoge/ ディレクトリ以下の設定
Options Indexes は、ブラウザでのインデックス表示(ディレクトリを指定してアクセスした際にファイル名一覧を返す)を許可する。
Order allow, deny や、 Allow from all はホストベースのアクセス制御を表す。
AllowOverride は、分散設定ファイルで上書きを許可するディレクティブの種類を定義する
<Directory "hoge/"> Options Indexes FollowSymLinks AllowOverride None Oder allow, deny Allow from all </Directory>
AllowOverride の設定値
設定値 | 内容 |
---|---|
None | 一切の上書き不可 |
All | .htaccess 内で利用可能なすべてのディレクティブが利用可能 |
AuthConfig | 認証に関するディレクティブが利用可能 |
FileInfo | ドキュメントタイプを制御するためのディレクティブが利用可能 |
Indexes | ディレクトリインデックスを制御するためのでぃれくち部が利用可能 |
Limit | ホストベースのアクセス制御に関するディレクティブが利用可能 |
Options | 特定のディレクトリにおける機能を指定するためのディレクティブが利用可能 |
ユーザー別のWebサイト公開の指定
ユーザー個々に Webサイトを公開するかどうかを指定する。
UserDir disable の場合、個々の Webサイトは公開されない
UserDir public_html の場合、「http://ホスト名/~ユーザー名」でアクセスしたときにホームディレクトリ内の public_html 内にアクセスすることになる
<IfModule mod_userdir.c> UserDir public_html </IfModule>
URL 未指定の際に、インデックスとして返すファイル名の指定
URL でファイル名が指定されなかった場合にインデックスとして返すファイル名を指定。 Apache は指定されたファイル名を順にチェックし、最初に見つかったものを返す。見つからなかった場合かつ Indexex オプションがセットされているときはファイル名一覧を返す。
DirectoryIndex index.html index.html.var index.php
分散設定ファイル名の指定
個々のディレクトリ内に分散設定ファイルを置くことで、そのディレクトリ以下に適用する設定を上書きできる。その分散設定ファイル名を指定する。
AccessFileName .htaccess
CGI プログラムのあるディレクトリへのマッピングを指定
CGI プログラムが格納されているディレクトリへのマッピングを指定する。「http://ホスト名/cgi-bin/foo.cgi」でアクセスした場合、「/var/www/cgi-bin/foo.cgi」が実行されることを表す。
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
メールサーバ
メールを取り扱うソフトウェアは3種類
- MTA (Message Transfer Agent) SMTPサーバとも呼ばれる
- MDA (Mail Delivery Agent) ローカル配送プログラム
- MUA (Mail User Agent) PCで利用するメールソフトウェア(メーラ)
メール配送の仕組み
- 送信側の MUA がメールを送信する
- MUA からメールを受け取った MTA1 がまず DNSサーバに問い合わせて、配送先 MTA を調べ、MTA2 へメールを配送する
- MTA2 はメールを受け取ると、MDA があて先となっているユーザーのメールボックスにメールを格納する
- 受け取り側の MUA がPOPサーバやIMAPサーバを経由してメールボックスからメールを取り出す
MUA からメールを MTA に送信するときや、MTA 間でのやりとりには SMTP (Simple Mail Transfer Protocol) というプロトコルが使われる。
MUA がメールを受信する際には POP (Post Office Protocol) や IMAP (Internet Message Access Protocol) がというプロトコルが使われる。
POPサーバやIMAPサーバは通常、SMTPサーバと同じマシンで動作していることが多く、合わせてメールサーバと呼んだり、呼ばなかったり、らじばんだり