« 2008年9月 | トップページ | 2008年11月 »

2008年10月

2008/10/19

Ubuntuサーバー版でFTPS環境を構築する

Ubnutuサーバー版をインストールし、WebDAV環境を作ったので、次はFTPS環境を作ります。

FTPSの使えるFTPサーバを調べた所、ProFTPDが使えるそうです。パソコンおやじに設定方法が載っていました。
ProFTPDは以前VineLinuxでFTPサーバを作ってみたことがあったので、楽勝だね!(と思ったときはいつも何かが起こる・・・。)
OSは、Ubuntu8.04.1 Server です。

ちなみにネットで検索すると、SFTPとFTPSを混同している間違いがけっこう目に付きます。
っていうか、SSHとSSLを混同しているっていうか・・・。
そういう私もLinuxを覚えたてのころは、どっちがどっちか区別ついていませんでした。
名前もやることも似ているけど、全然違うものです。
SFTPはSecure File Transfer Protocolの略でSSHを利用したプロトコルで、FTPSはFile Transfer Protocol over SSL/TLSの略でFTPのデータをSSLで暗号化する通信のことです。

ちなみにSFTPはSSHをインストールすると使えるので、Ubuntuサーバー版インストール時にSSHをインストールしていれば使えるようになっています。
クライアントも、WinSCPとかFilezilaとか使いやすいものがあります。
ただ、SSHの拡張なので見えて欲しくないファイルやディレクトリが見えるため、管理者以外のユーザーが使うには問題があるかなあと思いました。


さて、インストールしようと思ってパソコンおやじさんのセキュアFTPサーバの構築(ProFTPD+SSL/TLS:CentOS編)を見たところ、なんかSSL/TLS対応用RPMを作成してるんですけど・・・。
ProFTPDでSSL対応させる為には mod_tls を組み込んでコンパイルしなくてはいけないそうな。
が~ん!そういうことだったのか!
実運用させた場合、ディストリビューションのアップデートが使えないからその度に自分でコンパイルしてアップデートして・・ってな運用になります。
そんなのいやだ~。
ネットで調べても、Ubuntuサーバー版を使っている人は mod_tls を組み込んで~みたいな話をしています。
パッケージ版では無理なのか~。がっかり。

そう思っていたところ、こんなページも見つけました。
ふしぎなぼうしFTPS+LDAPなサーバ構築
ここでは Debian/lenny を使って ProFTPDのFTPS環境を作っていらっしゃいますが、mod_tls な記述はどこにも見当たりません。
もしかしたら最新版はSSL対応しているのかもしれない!と勝手に想像し、パッケージをインストールすることにしました。


ProFTPDのインストール
$ sudo apt-get install proftpd proftpd-doc
inetdで動かすか聞かれますが、常時稼動させたいのでスタンドアロンを選択しました。

インストール後試しに proftpd -l をしてみましたが、やっぱり mod_tls は見えません。本当に大丈夫なのか!?
いちおう設定ファイルにはtls関連のものが見えるんだけど。
・・・先に進みます。


proftpd.conf の修正 いちおう設定ファイルのバックアップも取っておきます。
$ cd /etc/proftpd/
$ sudo cp proftpd.conf proftpd.conf.BACK
$ sudo vim proftpd.conf

#UseIPv6                                on
UseIPv6                                off ←offに修正

# DefaultRoot                   ~
DefaultRoot                   ~ ←コメントをはずす


#Include /etc/proftpd/tls.conf
Include /etc/proftpd/tls.conf ←コメントをはずす


tls.conf の修正
$ sudo cp tls.conf tls.conf.BACK
$ sudo vim tls.conf

以下のコメントをはずし、修正する。
<IfModule mod_tls.c>
TLSEngine                   on

TLSLog                      /var/log/proftpd/tls.log

TLSProtocol                 SSLv23

TLSRSACertificateFile       /etc/ssl/Server/cert.pem ←サーバ証明書の位置です。
TLSRSACertificateKeyFile    /etc/ssl/Server/private.pem ←サーバ秘密鍵の位置です。

TLSRequired                 on ←TLSを強制する。(通常のFTP接続を不可にする)
</IfModule>


再起動する
$ sudo /etc/init.d/proftpd restart


この後、FileZillaのサイトマネージャのサーバの種類に、「FTPES - 明示的なTLS/SSL上のFTP」を選択して接続した所、ばっちりつなげました。
(ProFTPDはExplicitのみでImplicitには非対応です。そういうポリシーみたいです。)
FTPで接続した場合は、接続に失敗します。
なんだ、デフォルトで TLS/SSL に対応してるじゃん!

ただFileZillaがクライアント認証に対応してなくて、他にフリーで使えるFTPSクライアントが無いのが残念。
IPによる接続制限とパスワード認証でごまかすかなあ。


2008年11月3日 追記
上記で使ったFileZillaは、FileZillaPortable3.0.11だったのですが、このときは問題なく繋げていましたが3.1以降は繋げなくなりました。
というのも、FileZillaの作者がFTPSの仕様に厳密になるように仕様を変更したのですが、ProFTPDがその仕様を満たしていないのが原因のようです。
多くのFTPSサーバが仕様を満たしていなかったために問題が続発し、FileZillaの作者とユーザーとでかなり激しい議論があったそうですが、現状はFTPサーバ側が対応していく流れになっているようで、ProFTPDもまもなく修正したものが実装されるそうです。


あと、FTP専用ユーザーの作り方も載せておきます。
スタックアスタリスクのこの辺の記事を参考にしました。
/etc/shells に/bin/falseを追記する
$ sudo vim /etc/shells
/bin/false ← 最下部に追記

$ sudo useradd -d ホームディレクトリ -s /bin/false -p パスワード ユーザー名

| | コメント (0) | トラックバック (0)

Ubuntuサーバー版でWebDAV環境を構築する

前回、Ubuntuサーバー版のインストールが終わったので、WebDAV環境を作ります。

要件としては、
SSLに対応していることと、クライアント認証ができること、です。
OSは、Ubuntu8.04.1 Server です。

私は普段VineLinuxを使っています。これは一般的に Red Hat系 に属するディストリビューションです。(今は独自路線ですが。)
対してUbuntuは、Debian系 に属するディストリビューションです。
でも、VineLinuxはインストールやアップデートに apt-get を使う所がDebianと同じで、まそうは言っても同じLinuxだしアプリケーションの設定がディストリによって変わるとも思えないし簡単だろう、と思っていたわけです。
が・・・。全く違ったんだな、これが。


まず、OpenSSL のインストールをします。
基本的にUbuntu Sever Edition を使ったサーバ構築のメモを参考にし、クライアント証明書に関してはパソコンおやじさんのSSL用証明書の作成(Linux編)を参考にしました。
手前味噌ですが自分の所も参考にしました。(汗)

OpenSSL のインストール(ca-certificatesもいちおう入れてます)
$ sudo apt-get install openssl openssl-doc ca-certificates


設定ファイルの修正をします。デフォルト設定を変えておいて、作業を楽にします。
$ sudo vim /etc/ssl/openssl.cnf
#dir            = ./demoCA              # Where everything is kept 
dir             = /etc/ssl/CA  ←ディレクトリを変更しておく

default_days    = 3650 ←有効期間を 365 → 3650 10年に変更


countryName_default             = AU ← JPに変更
stateOrProvinceName_default     = Some-State ←  Tokyo に変更
localityName_default            = 市や区 ←  追加
0.organizationName_default      = Internet Widgits Pty Ltd ←  会社名に変更
organizationalUnitName_default  = 部署名← コメントアウトを外して、部署名 に変更
commonName_default = 管理者名かサーバー名 ←追加 
emailAddress_default = 管理者メールアドレス ← 追加


[ usr_cert ]
# This is OK for an SSL server.
# nsCertType                    = server
nsCertType                    = server  ← コメントアウトを外す


[ v3_ca ]
# Some might want this also
# nsCertType = sslCA, emailCA
nsCertType = sslCA, emailCA ← コメントアウトを外す

必要な各種ディレクトリ、ファイルを作成
$ cd /etc/ssl
$ sudo mkdir CA
$ cd /etc/ssl/CA

さて、ここで問題が。次に必要なファイルを作る再に以下のように
# cat /dev/null > index.txt
リダイレクトを使いたいのですが、sudo で操作するUbuntuではリダイレクト後のコマンドはユーザー権限なためファイルに書き込めません。
調べてみると、Lism.in * blogsudoでリダイレクトしてファイルを書き換えるとかに情報がありました。
cat /dev/null | sudo tee index.txt
sudo sh -c "cat /dev/null > index.txt"
って感じに、パイプとteeを使うか、コマンド全体を sudo にしてしまえばいいそうです。なるほど。

$ cat /dev/null | sudo tee index.txt
$ echo '01' | sudo tee serial
$ echo '01' | sudo tee crlnumber
$ sudo mkdir private
$ sudo chmod 700 private
$ sudo mkdir newcerts
$ sudo mkdir crl
$ sudo mkdir certs


秘密鍵の作成
$ sudo openssl genrsa -out private/cakey.pem 1024

秘密鍵を使ってオレオレうそっぱち認証局を作成 有効期限を10年にする
$ sudo openssl req -new -x509 -days 3560 -key private/cakey.pem -out cacert.pem
質問には、設定ファイルのデフォルトと同じ内容を記入(っていうか記入しなくてもデフォルトのままでよいはず)

サーバ証明書と署名リクエスト(CSR)を作成する準備をします。
$ sudo mkdir /etc/ssl/Server
$ cd /etc/ssl/Server

秘密鍵の作成
$ sudo openssl genrsa -out private.pem 1024

認証局に署名してもらう為リクエストを作成する
$ sudo openssl req -new -key private.pem -out request.pem
質問には、設定ファイルのデフォルトと同じ内容を記入(デフォルトでよいはず)
最後の2つの質問も、リターンで良い

CAで署名する
$ sudo cp /etc/ssl/openssl.cnf ./.
$ sudo openssl ca -config openssl.cnf -policy policy_anything -out ./cert-ca.pem -infiles request.pem
2つの質問は y で良い

サーバ証明書だけ抜き取る
$ sudo openssl x509 -in cert-ca.pem -out cert.pem


作成した鍵の確認
$ cd /etc/ssl/Server
$ openssl verify -CAfile /etc/ssl/CA/cacert.pem cert-ca.pem
cert-ca.pem: OK
$ openssl verify -CAfile /etc/ssl/CA/cacert.pem cert.pem
cert.pem: OK


クライアント用証明書の作成
設定ファイルの修正
$ sudo vim /etc/ssl/openssl.cnf

[ usr_cert ]

# This is OK for an SSL server.
# nsCertType = server (コメントを付けて元に戻す)

# For normal client use this is typical
# nsCertType = client, email
nsCertType = client, email ← コメントアウトを外す


$ sudo mkdir /etc/ssl/Users
$ cd /etc/ssl/Users

秘密鍵の作成
$ sudo openssl genrsa -out private.pem 1024

署名リクエスト作成
$ sudo openssl req -new -key private.pem -out request.pem
質問には、ユーザーの内容を答える
最後の2つの質問は、リターンで良い

CAで署名する
$ sudo cp /etc/ssl/openssl.cnf ./.
$ sudo openssl ca -config openssl.cnf -out cert.pem -infiles request.pem
2つの質問は y で良い

秘密鍵と証明書をまとめて、pkcs#12形式にする
$ sudo openssl pkcs12 -export -in cert.pem -inkey private.pem -certfile /etc/ssl/CA/cacert.pem -out pom.p12
Enter Export Password: 組み込み時のパスワードを設定する(ユーザー名とパスワードを、証明書組み込み時に聞かれるので忘れないように。)
Verifying - Enter Export Password: 確認

各ファイルにアクセス権を設定する
$ cd /etc/ssl/Server/
$ sudo chmod 600 ./*
$ chmod 644 cert.pem

$ cd /etc/ssl/Users/
$ sudo chmod 600 ./*

Apache2をインストールします。
Apacheの設定は何度もやっているので楽勝だろうと思っていたら大間違いでした。Debian系独特の操作方法に悩まされることに・・・。
えせSEの1日1HackUbuntuでApacheのsslを有効にする方法を参考にしました。

RedHat系ユーザーのハマり所としては、モジュールやサイトの設定は apache2.conf(httpd.conf)には書かない点でしょうか。Apache2になってからは、設定ごとに~.confファイルに記入しますが、Debianはもっと管理が細かいです。
設定ファイルは、mods-available や sites-availavle に置いておき、a2enmod や a2ensite コマンドで有効にすることによって、ファイルが mods-enabled や sites-enabled にリンクされて読み込まれる、という仕組みです。
コマンド一発でサイトの有効無効を設定できるのですが、慣れない身にはつらいものがあります。

Apache2のインストール
$ sudo apt-get install apache2 apache2-doc

デフォルトではSSLを使えるようにはなっていません。自分で設定するのか・・・。
SSL設定ファイルのコピー
$ sudo cp /usr/share/doc/apache2.2-common/examples/apache2/extra/httpd-ssl.conf.gz /etc/apache2/sites-available/
$ cd /etc/apache2/sites-available/
$ sudo gunzip httpd-ssl.conf.gz

SSL設定ファイルの修正
デフォルトでバーチャルホストの設定になっているので、そのまま使う
$ cd /etc/apache2/sites-available/
$ sudo vim httpd-ssl.conf

#Listen 443  ←コメントする(別の設定ファイルに既に記入済みのため)

<VirtualHost _default_:443> 

NameVirtualHost *:443
<VirtualHost *:443>
に修正

SSLCertificateFile "/etc/ssl/Server/cert.pem"     ← サーバ証明書の位置に変更

SSLCertificateKeyFile "/etc/ssl/Server/private.pem"   ← サーバ秘密鍵の位置に変更


ssl用のモジュールを有効にする。
$ sudo a2enmod ssl
再読み込みさせる。
$ sudo /etc/init.d/apache2 force-reload

サイト設定を有効にする
$ sudo a2ensite httpd-ssl.conf
$ sudo /etc/init.d/apache2 reload

ちなみにサイト設定を無効にする場合は
$ sudo a2dissite httpd-ssl.conf


WebDAVの設定
2バイト文字対応のため、mod-encoding をインストール
$ sudo apt-get install libapache2-mod-encoding

mod-encoding の設定
$ cd /etc/apache2/mods-available/
$ sudo vim encoding.conf ←新規ファイルを作成する
以下を記述
<IfModule mod_encoding.c>
    EncodingEngine    on
    NormalizeUsername on
    SetServerEncoding     UTF-8
    DefaultClientEncoding JA-AUTO-SJIS-MS SJIS
    AddClientEncoding "cadaver/" EUC-JP
</IfModule>


モジュールの有効化
$ sudo a2enmod dav
$ sudo a2enmod dav_fs ←既に有効っぽい
$ sudo a2enmod encoding

WebDAV用ディレクトリの作成
$ sudo mkdir /var/www-ssl
$ sudo mkdir /var/www-ssl/dav

WebDAV用ディレクトリに書き込めるようにapacheユーザー権限に変更する。
ちなみにユーザー名は /etc/apache2/envvars に書かれている
$ sudo chown -R www-data:www-data /var/www-ssl/dav
$ sudo chmod 755 /var/www-ssl/dav


SSL設定ファイルをWebDAV用に修正する
$ cd /etc/apache2/sites-available/
$ sudo vim httpd-ssl.conf

#DocumentRoot "/usr/share/apache2/default-site/htdocs"
DocumentRoot "/var/www-ssl" ←修正


</VirtualHost>の前ぐらいに以下を追加
ちなみに、クライアント認証設定です。

<Location /dav>
    Dav on
    SSLVerifyClient require
    SSLVerifyDepth 1
</Location>

再起動
$ sudo /etc/init.d/apache2 restart


以上で、WebDAV(クライアント認証版)の構築が終わりました。
クライアント側には、クライアント証明書 /etc/ssl/Users/pom.p12 を組み込む必要があります。

Windows標準のWebDAVクライアントは安定性に欠けるし大きなファイルを送れないので、フリーでクライアント認証可能なWebDAVクライアントを探したのですが、あまり無いですね。
TeamFileクライアントは高機能な上にクライアント認証対応なので、これで運用することにしました。
TeamFileクライアントのクライアント認証はWindowsのクライアント認証とは別なので、Excelなどを直接編集する時にWindows用の認証が必要になってしまいます。だから、ダウンロードしてから編集する設定にするのがいいのかな。

| | コメント (0) | トラックバック (0)

Ubuntuサーバー版をインストールする。

とある事情で、ファイルサーバーを構築することになりました。

サーバに使うディストリビューションを考えた所、サポート期間が長いことが条件になります。
本稼動させるものをホイホイバージョンアップできません。できたとしても作業するのはオレの可能性大なんで、避けたい所です。
そんなわけで、Fedoraなんかはまず候補から外れます。
そうすると、CentOSかUbuntu辺りが長そうだな、と思いました。
普段使っているVineも考えたのですが、最近のLinuxの情報を使うのにあたって、未だに文字コードがEUC-JPということが結構アダになってしまうんですよね。
そんなわけでデフォルトでUTF-8になっているものを選びました。

情報量的には、CentOS は パソコンおやじ に有用な情報が多いです。
対するUbuntuは情報は少ないけれど、Debianの情報を流用できると考えると、一気に情報量が増えます。

そんなわけでどちらでも良かったのですが、インストールCDが1枚でいいUbuntuにしました。(CentOSは4枚)

さて、今回やりたいことは、FTPSサーバとWebDAVサーバのテスト環境を構築し、どちらが運用しやすいかを検証することです。

環境は、以下です。テスト環境なので、VirtualBoxにインストールしました。
VirtualBox1.5.0
Ubuntu8.04.1 Server

インストール時に参考にしたページは、されどpemguinな日々Ubuntu Sever Edition を使ったサーバ構築のメモです。
Ubuntuの情報は巷に溢れているのですが、サーバー版になると極端に少なくなるので大助かりでした。

まず、http://www.ubuntu.com/getubuntu/download から
ubuntu-8.04.1-server-i386.iso をダウンロードしてCDに焼きます。
VirtualBoxから新規作成でインストールしていきます。


CDから起動後、画面が表示されたら言語を選択するためF2を押し、日本語を選択します。
キーマップを確認する為、F3を押してJapanが選択されていることを確認します。

インストール中、DHCPがあると勝手にDHCPで設定されてしまいますが、
IPを固定する場合はDHCPでの自動設定後、Tabキーで「戻る」を選択して戻ると、IPを固定する設定ができます。
でも、DHCPを入れておいて後からIP固定すると、DHCPを使いたくなった時にすぐ使えるのでこっちの方がいいかも。

ホスト名を適当に設定します。

パーティションを設定します。今回はテスト環境なので、深く考えずにインストーラにお任せで設定しました。

管理ユーザー(フルネーム)を設定します。
管理ユーザーを設定します。

プロキシは空白のままリターンキーを押します。

ソフトウェアの選択で、とりあえずSSHのみインストールしておきました。必要なものは後で個別にインストールします。
Webサーバは入れたいんだけど、LAMPが全部入ってしまうんですよね・・・。(そこが売りなんだけど。)

次に、みんなのハマり所、カーネルの入れなおしです。
インストール後、起動しようとすると「PANIC:CPU too old for this kernel.」と出て止まってしまうんですよね。
PAEに対応していないCPUだと、このエラーが出るそうです。
この機能自体は Pentium Pro 以降のCPUにはあるそうで実用上問題無いはずなのですが、400MHzバスの Pentium M には無いそうで、ノートパソコンにインストールした人はさぞかしハマったことだと思います。
ただ、幸い(?)仮想環境によっては同じ状態になることから実際にトラブる人はもっと多くて、そのため回避方法の情報もけっこう出回っています。

回避方法はCOMPNETVirtualBox 1.6でubuntu 8.04 serverを参考にしました。
手順が一ずつ書いてあり、解りやすいです。

いちおう私が行った作業です。
インストール後の再起動で「PANIC:CPU too old for this kernel.」が出た場合、UbuncuのCD-ROMから起動する。
インストールメニューで「壊れたシステムを修復」を選択して実行する。
Ubuntuをインストールしたときのルートファイルシステムを選択する。
レスキュー操作で「インストーラ環境内でシェルを実行」を選択して実行する。
シェルが立ち上がるので、以下のコマンドを実行する。
# chroot /target
# bash
# aptitude update
# aptitude install linux-generic
# exit

仮想マシンをHDDから再起動する。

再起動したわずかな隙に ESCキーを押して、GRUBのメニューを表示させる。
GRUBのメニューでGeneric版カーネル(たぶん3行目)を選択して実行する。
再起動がうまくいったら、
$ sudo vim /boot/grub/menu.lst
として、
default 0 → 2 に変更し(genericカーネルがGRUBメニューの3行目にあるはず)、genericカーネルでの起動をデフォルトにします。


次に、IPアドレスを固定します。
DHCPで動かす場合や、インストール時にIPを固定した場合は不要です。
ちなみに私は、インストール時にVirtualBoxのネットワークアダプタを「NAT」のまま設定したため、ここを修正するハメになりました。
最初からネットワークアダプタをホストインターフェースに割り当てていれば楽できたはずです。

$ sudo vim /etc/network/interfaces
以下のように変更。(IPアドレスを192.168.0.2とする場合)

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 192.168.0.2
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.168.0.1


DNSサーバのIPが設定されているか確認。(違ったら変更する)
$ sudo vim /etc/resolv.conf

IPアドレスを固定したら、適用する。再起動するか、以下のように入力する。
$ sudo /etc/init.d/networking restart


コンソールの文字化けを回避します。
サーバーのコンソールは2バイト文字に対応していないので文字化けします。
フォントを読み込むスペースが無いのが原因だそうで、この辺はLinuxの常識みたいですが、Vineユーザーとしてはコンソールに日本語が表示されるのが常識です。(笑)
そんなわけで、サーバーのコンソールは日本語を表示しないようにします。
ただし、SSHなどのターミナルから接続した時は日本語表示させます。

$ vim ~/.bashrc
ファイルの末尾に、以下のように記述します。

case $TERM in
    linux) LANG=C ;;
    *) LANG=ja_JP.UTF-8 ;;
esac

設定をすぐに反映させます。
$ source ~/.bashrc


パッケージを最新に更新しておきます。
$ sudo apt-get update
$ sudo apt-get upgrade

これで、サーバーのインストール部分については完了です。
次に必要なアプリケーションをインストールせねば・・・。

| | コメント (0) | トラックバック (0)

« 2008年9月 | トップページ | 2008年11月 »