OpenSSH

SSHとは、ネットワークを介して安全な通信を行うためのプロトコル。強力な認証機能と暗号化により、ファイル転送やリモート操作を安全に行うことができる。

SSHの認証手順

  1. ホスト認証
  2. ユーザー認証
    1. 公開鍵認証
    2. パスワード認証

ホスト認証

ホスト認証とは、接続先ホストの正当性を確かめる手段。これによってなりすましによる偽の SSHサーバに接続してしまうことを防ぐ。ホスト認証は、SSHサーバのホスト認証鍵を使って行われる。

ユーザー認証

ユーザー認証方法は複数用意されている。代表的なものは

  • 公開鍵認証
  • パスワード認証

公開鍵認証は公開鍵暗号方式を利用してユーザーを認証する。公開鍵認証を行うには、サーバ側にあらかじめ公開鍵を登録しておく必要がある。

  1. あらかじめサーバに公開鍵を登録
  2. 接続時にユーザーの鍵が利用できるか確認
  3. ユーザーは、公開鍵やユーザー名からデータを作成し、秘密鍵による電子署名を行う
  4. 上記データと電子署名をサーバに送る
  5. サーバ側でデータと署名を検証
  6. 検証に成功した場合ログインを許可する
公開鍵と秘密鍵

公開鍵暗号方式では、一対の公開鍵と秘密鍵の鍵ペアを使って暗号化と複合を行う。

公開鍵 暗号化に利用
電子署名の検証に利用
秘密鍵 復号化に利用
秘密鍵による電子署名を行う

ある公開鍵を使って暗号化されたものは、対になる秘密鍵を用いてのみ復号化することができる。また、秘密鍵を使った電子署名は、対になる公開鍵を使うことで検証することができる。

SSHサーバの設定

Linux ではオープンソースのソフトウェア、OpenSSH が採用されている

OpenSSH を利用するのに必要なパッケージ
  • openSSH
  • openssh-server
  • openssh-client
  • openssl
  • openssh-askpass (必須ではない)
  • openssh-askpass-gnome (必須ではない)

SSHサーバの設定ファイル

  • /etc/ssh/sshd_config

デフォルトのままでも利用可能。安全性をさらに高める、設定変更するとき用に

Port

SSH はデフォルトで22番ポートを使う。変更する場合、コメントアウトし、ポート番号を変更する。

#Port 22
Protocol

デフォルトでは、SSH バージョン1、 SSH バージョン2 両方のプロトコルを扱う。クライアント側がバージョン2に対応しているのであれば、「Protocol 2」としておくのが吉

Protocol 2
PermitRootLogin

root ユーザーによるログインを許可するかどうかを指定する。万が一 root パスが推測された場合、ログインを許してしまうことになるため、「PermitRootLogin no」としておくのが安全

#PermitRootLogin yes
RSAAuthentication

SSH バージョン1での公開鍵認証を許可するかどうかを指定する。デフォルトでは許可。

#RSAAuthentication yes
PubkeyAuthentication

SSH バージョン2での公開鍵認証を許可するかどうかを指定する。デフォルトでは許可。

#PubkeyAuthentication yes
PermitEmptyPasswords

パスワード認証を許可している場合、空パスワードを許可するかどうかを指定する。セキュリティを高めるため「PermitEmptyPasswords no」としておくのが無難

#PermitEmptyPasswords no
PasswordAuthentication

パスワード認証を許可するかどうかを指定する。公開鍵認証の設定が完了すればパスワード認証は必要ないため、設定完了後に「PasswordAuthentication no」とするとセキュリティあっぷ

PasswordAuthentication yes

SSH クライアントの利用方法

SSHクライアントコマンドは、openssh-client パッケージに含まれている。
主なコマンド

ssh telnet の代替コマンドとして利用できる
scp ファイルコピーを行う

ssh コマンド

SSHクライアントからSSHサーバへ接続する。基本的な書式

ssh ユーザー名@ホスト名 or IPアドレス

例)ホスト「host」に、ユーザー「hoge」としてログイン

ssh hoge@host

初回接続時、SSHサーバからホスト認証鍵が送られてくるので、受け入れる場合は「yes」と入力。次にパスワードを入力するとログインが完了する。ホスト認証鍵はユーザーの 「 ~/.ssh/known_hosts 」 ファイルに格納される。
※ ホスト認証鍵のバックアップなしでサーバを再インストールした場合、初回起動時にホスト認証鍵が自動的に生成される。新たなホスト認証鍵は以前のものとは異なるため、そのままでは警告が出る。このような場合、「 ~/.ssh/known_hosts 」 ファイル内の該当エントリを削除すれば解決する

SCP コマンド

SCPコマンドは、SSH の仕組みを使って安全にファイルをコピーするコマンド
基本的な書式

scp ユーザー名@コピー元ホスト:コピー元ファイル名 ユーザー名@コピー先ホスト:コピー先ファイル名

例) ローカルホストからリモートホストへのコピー

scp /etc/hosts host03:/tmp

例) リモートホストからローカルホストへのコピー

scp host03:etc/hosts .

例) ユーザーを指定してのコピー

scp /etc/hosts hoge@host03:/home/hoge

公開鍵認証の利用

公開鍵認証を使うと、パスワードを使わないでログインできる。その代わり、正当な秘密鍵と、秘密鍵を利用するためのパスフレーズを使う。公開鍵認証を利用するには、まず公開鍵と秘密鍵の鍵ペアを作成する必要がある。

鍵ペアの作成
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
  1. 鍵ファイルの名前を指定
    通常はデフォルトでOKなのでそのまま [Enter] キーを押せばOK
  2. パスフレーズの入力
    秘密鍵を使う時に求められるパスフレーズを2度入力する。パスワードよりも長い、空白を含めた文字列の指定が可能。 [Enter] キーのみを押すと空のパスフレーズが作成される。

鍵ペアは、「 ~/.ssh 」ディレクトリ以下に作成される

公開鍵のコピー

公開鍵ファイルを SSHサーバ内の ~/.ssh/authorized_keys ファイルに登録する。

scp .ssh/id_dsa.pub host03:

SSH 関連ファイルのパーミッション

ファイル名 パーミッション 内容
~/.ssh 700 (必須) 他のユーザーにアクセス権がないようにする
~/.ssh/id_dsa 400 (推奨) 誤って書き換えないようにする
~/.ssh/id_dsa.pub 400 (推奨) 他のユーザーに書き込まれないようにする
~/.ssh/authorized_keys 600 (推奨) 他のユーザーに書き込まれないようにする

Webサーバ

Webサーバは、HTMLや画像などの情報をサーバにストックし、クライアントからの要求があると、ネットワーク経由で要求された情報をクライアントに送信する
現在、Webサーバで最も人気が高いサーバは、Apache

Webサーバの仕組み

Webサーバとクライアントとの間の通信は、HTTP (Hyper Text Transfer Protocol) と呼ばれるプロトコルによって行われる。その為、WebサーバはHTTPサーバとも呼ばれる。

  1. WebブラウザからWebサーバにリクエストを送信する
  2. 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 (Common Gateway Interface) とは、Webサーバから外部のプログラムを呼び出す仕組み。CGIを使うと何が違うのか

びふぉあ

リクエストに応じてあらかじめ用意されている HTMLファイルを返す
表示される内容は常に一定

あふたー

PerlC言語などで記述された外部プログラムを実行し、その実行によって生成された HTML などをレスポンスメッセージとして返す。
動的な Webページを作ることが可能に!すごいぞ CGI!

CGI を利用する

CGI を利用するためには mod_cgi モジュールがロードされている必要がある。また httpd.conf ファイルで次のような設定が必要になる。設定方法は2種類。

  • ScriptAlias ディレクティブで指定する
  • 特定のディレクトリ以下を Options で指定する
ScriptAlias で指定

デフォルトで設定されている方法。特定のディレクトリ以下へのリクエストがあった場合、CGI とみなしてそれが実行される。
デフォルトの ScriptAlias ディレクティブ

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
Options で指定する

CGI を実行したいディレクトリに対し、下記のように指定する

<Directory "/home/www/cgi-bin">
    Options +ExecCGI
</Directory>

また、どのファイルが CGIプログラムであるかを特定するため下記の記述も必要になる

AddHandler cgi-script .cgi

CGI プログラムは apache ユーザーがアクセスし実行できる権限が設定されている必要あり
※ ユーザーのホームディレクトリ内を公開するときは、ホームディレクトリのパーミッションを711などに変更する必要あり

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
php プログラムが動作するかの確認

ファイルを新規作成してアクセスする

<html><body>
<?php
   phpinfo();
?>
</body></html>

基本認証 (BASIC認証)

基本認証 (BASIC認証) を使うと正しい ユーザー名/パスワード を入力しなければ見ることのできないディレクトリを設定できる。基本認証の設定は、2種類。

  • httpd.conf に設定する方法
  • .htaccess ファイルを用意する方法

毎度おなじみ .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 に記述を追加

<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
トップディレクトリの指定

httpd が利用するトップディレクトリを指定

ServerRoot "/etc/httpd"
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...
子プロセスの実行ユーザーと実行グループの指定

Apache の子プロセスの実行ユーザーと、実行グループを指定する

User apache
Group apache
サーバ管理者のメールアドレスの指定
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/"
レスポンスへのデフォルトの文字設定の指定

明示的に文字セットを指定していないレスポンスに追加されるデフォルトの文字セットを指定する。デフォルトではUTF-8。が、HTMLファイルが EUC-JP や SJIS で記述されていた場合は文字化けが発生する。
ここはコメントアウトしておくのが無難?

AddDefaultCharset UTF-8

メールサーバ

メールを取り扱うソフトウェアは3種類

  1. MTA (Message Transfer Agent) SMTPサーバとも呼ばれる
  2. MDA (Mail Delivery Agent) ローカル配送プログラム
  3. MUA (Mail User Agent) PCで利用するメールソフトウェア(メーラ)

メール配送の仕組み

  1. 送信側の MUA がメールを送信する
  2. MUA からメールを受け取った MTA1 がまず DNSサーバに問い合わせて、配送先 MTA を調べ、MTA2 へメールを配送する
  3. MTA2 はメールを受け取ると、MDA があて先となっているユーザーのメールボックスにメールを格納する
  4. 受け取り側の MUA がPOPサーバやIMAPサーバを経由してメールボックスからメールを取り出す

MUA からメールを MTA に送信するときや、MTA 間でのやりとりには SMTP (Simple Mail Transfer Protocol) というプロトコルが使われる。
MUA がメールを受信する際には POP (Post Office Protocol) や IMAP (Internet Message Access Protocol) がというプロトコルが使われる。
POPサーバやIMAPサーバは通常、SMTPサーバと同じマシンで動作していることが多く、合わせてメールサーバと呼んだり、呼ばなかったり、らじばんだり

POP/IMAP

POP/IMAP を使ってメールを受信するには、POP/IMAPサーバが必要
CentOS では、POP/IMAP に対応した dovecot が用意されている

確認、インストール
yum info dovecot

yum install dovecot
dovecot の起動
service dovecot start
dovecot の動作確認
[riceplanting@localhost ~]$ netstat -at
tcp        0      0 *:imaps           *:*            LISTEN
tcp        0      0 *:pop3s           *:*            LISTEN

後はメールクライアントでアカウントの設定をすればOK