サーバー

VPS NGINXとSSL,FTPサーバーのインストール

さくらのVPSコントロールメニューから「OSインストール」を選択し、インストールするOSにCentOS7、スタートアップスクリプトにLetsEncryptを指定して初期化します。

これによりWebサーバーは、デフォルトでNGINXが組み込まれます。SSLサーバー証明書を取得する手続きも自分で操作することなく取得、この時点でhttpsによるアクセスができるようになります。動作確認は、ブラウザーでインストールしたサーバーサイトに対して、httpとhttpsの両方を指定して表示してみました。

さてインストール後は、先ずは自分が利用しやすいようにサーバーの動作環境を設定、変更していきます。サーバーへはsshを利用してログインします。

インターネット上でグローバルにアクセスできるサイトは、必ずブルートフォースアタックされます。sshも同様ですので、先ずはrootログインできないようにするなど、セキュリティー面を万全にします。合わせて自身がrootコマンドを実行できるようにユーザー管理の設定を実施しておきます。

作業は以下のページにある前回操作した方法と同様です。

» さくらのVPS1日目 利用開始、DNSとSSHのセットアップ

今回のOSインストールではSELinuxが有効化されておらず、そのまま利用することにしたため、前回苦労したSELinuxに関する内容はありません。

# getenforce
Disabled

ファイルリスト一覧を見易くする

ファイルリストは既存ファイルや更新日時を参照するため、頻繁にlsコマンドを利用して見ます。

ファイルの最終アクセス日時表示が分かりやすい「yyyy-mm-dd hh:mm」にするためlsコマンドにパラメータを都度入力するのは面倒なので、シェルの設定ファイル「.bashrc」にエイリアスを設定します。

自身の「/home/ユーザー/.bashrc」ファイルと、rootの「/root/.bashrc」ファイルの両方に以下の設定を追加します。

alias ll='ls -al --time-style=long-iso'

.bashrc書き換え後の反映は以下のコマンドを実行します。

$ source ~/.bashrc

vi,vimの日本語入力

ターミナルから日本語入力したところ文字化けしました。VPSサーバーのセットアップスクリプトはシェルを日本語化設定していないようなので、その対処方法を検索しました。

viの環境設定でファイルエンコーディング項目が、システムのロケールを参照して設定していることから、システムのロケールを変更してファイルエンコーディングをUTF-8になるようにします。

viの設定を確認します(lessコマンドで設定ファイルを見ると以下のような記述がありました)。

# less /etc/virc

if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
    set fileencodings=ucs-bom,utf-8,latin1
endif

次にシェル環境のロケールを確認します(localctlコマンドでstatusを見ると以下のように表示されました)。

# localectl status

System Locale: LANG=C
    VC Keymap: jp106
   X11 Layout: jp

ロケールを日本語を使うutf8に設定して反映する

# localectl set-locale LANG=ja_JP.utf8
# source /etc/locale.conf

これでvimで日本語入力ができるようになりました。

参考ページ:
viやvimで日本語が文字化けする場合の対処方法

sshの接続時間変更

ログインしたまま資料を確認している間に接続が切れてしまう、ことが何度か発生して再ログインに煩わされました。そこで接続が切れないように設定を変更します。

サーバー側にパケットを送ることで接続切れを回避できるようなので、クライアント側に5分間隔でパケットを送る設定をユーザーホームの「.ssh/config」ファイルに次の2行を追加します(クライアントPCはMac miniです)。

$ vim .ssh/config

ServerAliveInterval 300
TCPKeepAlive yes

SSLを利用したFTPサーバーをセットアップ

サーバー証明書を取得しましたので、FTPも暗号化通信を利用したファイルのアップロード、ダウンロードを実行できるようにします。同じ事がftpサーバーを利用せずsshのSFTPで実現できますが、ファイル転送に時間が掛かるようなのでFTPSを利用することにしました。

FTPサーバーはvsftpdをインストールします。

# yum install vsftpd

「vsftpd -v」でバージョンを確認したところ「vsftpd: version 3.0.2」 と表示されました。

次にFTPSを実現するため、vsftpdの環境ファイルの設定になりますが、暗号化通信を利用するにはサーバー証明書と秘密鍵のファイルを指定する必要があります。

これらは、OSインストール時のスタートアップスクリプトによりLet’s Encryptから取得しているので、それらを利用することにします。

ファイルがどこに保存されているか分らなかったのでNGINXの設定ファイルを見たところ、「/etc/nginx/conf.d/https.conf」に次のような設定がありました。

ssl_certificate /etc/letsencrypt/live/サイトのURL/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/サイトのURL/privkey.pem;

設定の「サイトのURL」は、OSをインストールする際にサイトの「サブドメイン」を指定しますが、そのサブドメインの内容と同じものになります(例:shop.example.comなど)。

ところでSSLではサーバー証明書、秘密鍵の他、公開鍵があります。通信データは公開鍵を利用して暗号化され、サーバー側の秘密鍵を使って復号化されます。その公開鍵はここでは見当たりませんが、どうやらサーバー証明書ファイルに追加して含まれているようです。これは証明書のデータ構造として、複数のデータを含むことができる仕様になっているからです。

以下、FTPサーバーの設定ファイルの編集内容です。vimを利用して「/etc/vsftpd/vsftpd.conf」を修正しました。

anonymous_enable=NO
#ascii_upload_enable=YES
#ascii_download_enable=YES
# SSL有効化
ssl_enable=YES
ssl_tlsv1=YES
# 証明書ファイル
rsa_cert_file=/etc/letsencrypt/live/サイトのURL/cert.pem
# 秘密鍵ファイル
rsa_private_key_file=/etc/letsencrypt/live/サイトのURL/privkey.pem
# 接続はSSL強制、平文は使用禁止
force_local_logins_ssl=YES
force_local_data_ssl=YES
# パッシブモード利用設定
pasv_enable=YES
pasv_min_port=50021
pasv_max_port=50040
pasv_addr_resolve=YES
pasv_address=サイトのURL
# データコネクションではSSL認証しない
require_ssl_reuse=NO
#ファイルスタンプのローカル時間表示
use_localtime=YES

残りの作業は、ftpで利用するポートの解放、サービスの登録です。これでftpsが利用できるようになります。

先ずはfirewall-cmdで現在解放中のポート確認します。

# firewall-cmd --list-services

ftpポートが解放されていなかったので、firewall-cmdコマンドで設定するポートの名称を確認しました。

# firewall-cmd --get-services

「ftp」があったので「ftp」ポートを解放します。ポートはパッシブモードも利用できるようにしましたので、それらも合わせて解放します。その際サーバー再起動後も解放されるように、パラメータに「–permanent」を付加します。

「–permanent」を指定すると「firewalld」に設定が反映されないとのことで、「–reload」を実行します。

# firewall-cmd --add-service=ftp --zone=public --permanent
# firewall-cmd --add-port=50021-50040/tcp --zone=public --permanent
# firewall-cmd --reload

なお恒久的にサービスを追加する場合、「public」ゾーンに「ftp」サービスを追加するため「–add-service=ftp」を付加して実行します。

参考まで、サービスを削除する場合は次のように実行します。

# firewall-cmd --permanent --zone=public --remove-service=ftp

次のように実行して設定内容を確認します。

# firewall -cmd --zone=public --list-all

ftpサービスを起動します。

# systemctl start vsftpd.service

サービス一覧で自動起動か確認します。

# systemctl list-unit-files -t service

ftpサービスを自動起動するように設定します。

# systemctl enable vsftpd.service

解決できなかった問題

自身のPC(Mac mini)で利用するftpクライアントは、これまで使い勝手の良いブラウザーFirefoxのFireFTPアドオンを利用していました。ところがFirefoxがバージョンアップしてアドオン仕様を変更したため、56.0.2以降のFirefoxでは利用できなくなってしまい、Firefoxのバージョンアップも止めていました。

vsftpdを利用できるようにしていつものようにFireFTPでアクセスしたところ、アップロードに時間が掛かりました。どうも再接続を繰り返ししているようでした。

以下の設定はそれを解決するためvsftpdサーバー側の設定を変更した内容ですが、結局解決できず利用を断念し、FilezillaをMac miniにインストールして使うことにしました。

参考まで:

アップロードに時間が非常にかかったため、vsftpdサーバー側の設定をいろいろ変更してみました。変更した内容は次の通りです。

アスキーモード転送の設定をコメントアウトしました。

#ascii_upload_enable=YES
#ascii_download_enable=YES

パッシブモードの設定で、DNSにより開始時にIPが解決済みである設定を追加しました。

pasv_addr_resolve=YES
pasv_address=サイトのURL

参考ページ:
さくらのVPS設定マニュアル FTPの設定
FTPS (FTP over SSL) (3) FTPSサーバー環境
CentOS7にvsftpdでFTPサーバ構築
FTPにおけるアクティブモードとパッシブモードの違い

Let’s Encrypt更新時

3カ月に一度更新されますが、更新後FileZillaで「無効な証明書」のエラーが出るようになりました。証明書の期限が切れたためのエラーですが、ブラウザーで証明書を確認すると期限は正しく延長されています。

ftpdを再スタートすることでエラーが出なくなりましたので、証明書更新時の処理にftpdの再スタートを組み込めば良いと思いますが、今ちょっと調べる時間が取れないため後日検討したいと思います。

(2018-12-19)