はじめに

第一回とありますが、このシリーズでは『OSインストールからウェブサーバの構築+α』までの一連の流れを説明していきます(もともとはメモ代わりですが)。

1記事として全てまとめて書いても良いのですが、その場合は非常に長くなってしまうのでいくつかの記事に分割して紹介していきます。

今回は第一回目です。

このセクションでは、新しく記事が公開される度に記事リンクをまとめて置いておきます。

なお、このシリーズではホスティングにVultrを使っています。

サーバのスペックおよび構成は以下の通りです。

  • $ cat /etc/lsb-release

    • DISTRIB_ID=Ubuntu
    • DISTRIB_RELEASE=20.04
    • DISTRIB_CODENAME=focal
    • DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
  • Vultr : High Frequency Server

    • 32GB MVMe
    • 1CPU
    • 1GB Memory
    • Additional Features
      • Virtual Private Clouds: ON

今回の編集時に使用するエディタはvimです。文字入力開始(insert)はi、保存して終了は:wq、保存せずに終了は:!qです。フラグの解除はEscキーです。

コマンド表示時の$ コマンドにあるドルマークは入力可能状態を表しています。意味を表す記号で最初から表示されているため、実際の入力時にドルマークを入力する必要はありません。

これが# コマンドの場合のシャープはrootユーザー(管理者権限)を意味します。こちらも入力時は同様です。

Ubuntuのインストール

今回はServer版を使いますが、サーバ運用以外でも使う予定がある場合はDesktop版でも構いません。

Ubuntuのダウンロードおよびインストール

  1. まずはUbuntu公式サイトにてUbuntu Serverのisoファイルをダウンロードしておきます。執筆時点ではUbuntu Server 20.04.3 LTSです。

  2. ダウンロードが終われば、Vultrのサーバ新規設定であるDeploy New InstanceServer Typeで先程ダウンロードしたisoファイルをアップロードします。

    UbuntuのisoファイルをVultrにアップロード
  3. アップロード後、My ISOsで選択できていればあとはDeploy Nowでサーバをデプロイします。

Ubuntuのインストール設定

Deploy後はサーバステータス内のView Consoleにてコンソール画面で操作することが可能です。

  1. 起動直後は読み込み等を行っているため、しばらく待機します。

  2. その後Use UP, DOWN and ENTER keys to select your language.という文言が出てくるので、ここではEnglishを選択します。

    1. すると、次はInstaler update availableという項目が出てくることがあり、ここではUpdate to the new installerを選択してしばらく待ちます。
  3. それが終わると次にKeyboard configurationの項目が表示されるので、Layout: Japaneseを選択し、Doneを選びます。

    1.ただし、もし使用しているキーボードが日本語文字列ではない場合は対応した言語を選択してください。

  4. 次はNetwork connectionsの項目ですが、ここは特に変更する箇所はないのでそのままDoneを選択します。もし変更したいところがあれば適宜行ってください。

  5. Configure proxyも同様に変更箇所は特に無いのでDoneを選びます。

  6. Configure Ubuntu archive mirrorでは自動的にミラーアドレスが表示され、日本ではhttp://jp.archive.ubuntu.com/ubuntuが表示されているので、そのままDoneを選びます。

  7. 次にGuided storage configurationが表示され、変更がなければDoneを選びますが、ストレージの構成を変更にしたい場合はCustom storage layoutを選んだあとにDoneを選択します。

    1. カスタム設定にした場合はStorage configurationが出てきますが、例えばディスクのファイルシステムをxfsに変更したい場合はAVAILABLE DEVICESの下にある/dev/vda localdisk 32.000Gを選択し、Add GPT Partitionを選ぶとAdding GPT partition to /dev/vdaが表示されます。
    2. Adding GPT partition to /dev/vdaではFormatを選び、現在のext4からxfsを選択し、Createします。
    3. すると再びStorage configurationに戻り、現在の構成が表示されますが、これで問題が無ければDoneを選んでください。
    4. カスタム設定の最後にはConfirm destuctive actionが表示され、 ディスクを初期化しても良いかと聞かれるので問題がなければContinueを選びます。
  8. 次はProfile setupを行います。Your nameは自分の名前を入力しますが、これはユーザ名とは別のものです。

    1. Your server's nameはサーバ自体の名前を入力します。コンソールではYour server's name@usernameという位置です。
    2. Pick a usernameはユーザ名を入力します。
    3. Choose a passwordには好きなパスワードを入力し、確認としてConfirm your passwordには同じパスワードを入力します。
  9. 次はSSH Setupですが、今回はSSH(Secure SHell)接続を行うため、必ずInstall OpenSSH serverにチェックを付けてください。チェックを付けたらDoneを選びます。

    1. チェックを付けるとImport SSH identityが出てきますが、ここでは新規作成を行うのでNoのままでOKです。
  10. 最後にFeatured Server Snapsでは必要な機能があればチェックを入れますが、今回はこの項目で何もチェックを入れませんのでDoneを選択します。

  11. 全項目の設定が終わればインストールが開始されるので、インストールが完全に終了するまで待機します。Install complete!ではなく、下記にReboot Nowが表示されるまで待つ必要があります。表示されたら再起動を行います。

  12. なお、再起動の際、セットしたUbuntuのisoファイルがそのままになっているとずっとインストール項目に移動しつづけてしまいます。なので、Vultrのサーバステータスから自身のサーバを選択し、SettingsCustom ISOの順で移動するとRemove ISOがあるのでISOを除去しておきましょう。除去後は自動で再起動が行われます。

Ubuntu初期設定

アップデート

Ubuntuのインストールを完全に終わらせた場合は既にアップデートのインストールは完了しています。

$ sudo apt updateを入力することで現在のアップデート状況をチェックすることができます。

$ sudo apt upgradeによってアップデートをインストールすることができます(推奨)。

$ sudo apt dist-upgradeもしくは$ sudo apt full-upgradeでは完全なアップデートのために障害となるパッケージは削除される可能性があります。

なお、パッケージ管理コマンドにはaptapt-getがありますが、apt-getではインストールしていないパッケージが必要となる場合にアップグレードが停止します。

そのため、基本的には柔軟な動作を行うaptが推奨されています。

厳格にパッケージを管理したい場合にはapt-getを使うと良いでしょう。

TeraTermの導入

Vultrのコンソール画面のままでは非常に扱いにくいので、ここでは大変便利なターミナルエミュレータであるTeraTermを導入します。

  1. TeraTermをダウンロードして展開後、ttermpro.exeというファイルがあるのでそれを起動します(ショートカットを作っておくと便利です)。

  2. 起動後、FileNew connection...の順で選択するとTera Term New connectionという画面が出てくるので、Host:には先程作成したサーバのIPを入力し、TCP port#には22を入力します。

  3. するとSECURITY WARNINGと共にfingerprintが表示されますが、そのままContinueを選んでください。

  4. SSH Authentivationの項目が表示されるので、User name:にサーバのユーザ名を入力し、Passphrase:にはパスワードを入力後、OKを選択するとサーバにログインすることができます。

この後すべてのコンソール内の操作はTeraTerm経由で行われます。

netplanの設定変更

再起動後、コンソールにA start job is running for wait for network to be configuredという文章が表示され、非常に長く待たなければならないケースが発生する場合があります。

これを解決するにはnetplanの設定を変更する必要があります。

$ sudo vim /etc/netplan/00-installer-config.yaml

00-installer-config.yaml

# This is the network config written by 'subiquity'
# 各インターフェースにoptional:trueを追加する
network:
  ethernets:
    enp1s0:
      dhcp4: true
      optional: true
    enp6s0:
      dhcp4: true
      optional: true
  version: 2

:wqで上書き保存し、その後$ sudo netplan applyで設定の変更を適用させます。

文字化け対策

現時点のサーバは日本語に対応しておらず、仮に入力した場合には文字化けが発生してしまいます。

そのため、別途日本語パッケージをインストールして適用させなければなりません。

  1. まずは$ locale -aで現在の言語設定を確認します。初期状態では以下のようになっており、日本語が入っていません。
C
C.UTF-8
en_US.utf8
POSIX
  1. $ sudo apt install language-pack-ja-base language-pack-jaで日本語パッケージをインストールします。

  2. インストール後はシステム表示を一部英語にしたまま日本語表示可能にします。理由としてはエラーメッセージなどは英語の方が検索に引っかかりやすいためです。

  3. $ sudo vim ~/.bashrcで言語設定を行います。

bashrc

# 最後に記載する
case $TERM in
    linux) LANG=C ;;
    *)     LANG=ja_JP.UTF-8;;
esac
  1. その後は$ source .bashrcで設定を反映させます。ただし、システム表示は日本語化状態となっているため、反映させるには$ sudo rebootによるサーバの再起動が必要となります。

    1. もしシステムを含む全部を日本語表示にしたい場合は$ echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrcおよび$ echo 'export LANGUAGE="ja_JP:ja"' >> ~/.bashrcを入力することで、日本語訳に対応している項目はすべて日本語で表示されます。
  2. 次に$ sudo vim ~/.vimrcでエディタであるvimの編集も行います。

vimrc

" settings
set fenc=utf-8
set encoding=utf-8
set fileencodings=utf-8
set fileformats=unix,dos,mac

vimの場合は保存した時点で自動的に反映されます。

以上で文字化け対策の完了です。

セキュアなSSH設定

現時点では簡易的なSSH接続を行っているため、セキュリティ的には脆弱です。

そのため、一定以上の安全性を確保するためにSSHの設定を更新します。

鍵認証の追加

新規に作成した鍵を使ったログイン方法を追加します。

  1. まず、TeraTermのメニューバーにあるSetupを選択します。

  2. 次にSSH Key Generatorを選択します。

  3. するとTTSSH: Key Generatorという項目が表示されます。

  4. Key typeED25519を選び、Generateを選択します。

  5. 下部にKey passphrase:が表示されるため、この鍵に対するパスワードを設定します。

    1. Comment:は有り無しどちらでも構いません。
  6. Confirm passphrase:にも同様のパスワードを入力したら、Save public keyおよびSave private keyを自身のデバイスの任意の場所に保存します。

    1. Public keyは公開鍵を意味し、鍵付きのドアのようなものなので、基本的に誰に見られても問題はありません。
    2. Private keyは秘密鍵を意味し、そのドアを開けるための鍵です。なので許可した人以外に秘密鍵を絶対に知られてはいけません。
  7. 公開鍵と秘密鍵を保存した後、公開鍵(id_ed25519.pub)をTeraTermの画面にログインした状態でドラッグアンドドロップします。

  8. Tera Term: File Drag and Dropという項目が出現するので、何も入力せずにOKを選択します。

    1. 入力無しの場合、公開鍵は/home/ユーザ名にアップロードされます。
  9. アップロードした公開鍵を認証用に設定します。

    1. $ pwdで現在のディレクトリを確認し(移動していなければ/home/ユーザ名が表示される)、$ lsで現在のディレクトリのファイルも確認する(指定したディレクトリにアップロードしていればid_ed25519.pubが表示される)
    2. $ mkdir .sshでSSH用のディレクトリを作成する。
    3. $ chmod 700 .sshでファイルのパーミッション(許可)を変更する(3つの数字は順に所有者:グループ:その他)。700では所有者のみが読み込み書き込み実行できます。
    4. $ mv id_ed25519.pub .ssh/authorized_keysで公開鍵を移動します。
    5. $ chmod 600 .ssh/authorized_keysauthorized_keysディレクトリを所有者のみ読み書き可能に切り替えます。
  10. 設定が完了することで鍵でのログインが可能となります。

  11. 実際にログインするには、通常ログインと同じようにTera TermメニューバーでNew connection...を選び、Host:TCP port#に同じポート番号を入れてSSH Authenticationを表示させます。

    1. この時、User name:は同じユーザ名を、Passphrase:には鍵のパスワードを入力します。
    2. 次に下部にあるAuthentication methodsにはUse RSA/DSA/ECDSA/ED25519 key to log inを選択し、Private key file:には先程保存した秘密鍵であるid_ed25519(拡張子無し)を選択します。
    3. 選択が終わればあとはOKでログインすることができます。
    4. ここで注意なのが、鍵でログインする際はパスワードが最初と異なりますが、ログイン後はサーバで設定したパスワードを使用しています。

sshd_configの設定

鍵でのログインはできるようになりましたが、そもそも現段階では鍵でしかログインができないというわけではなく、パスワードを用いた通常ログインがまだ可能になっています。

そのため、更に安全性を高めるために新たな設定を行います。

  1. $ sudo vim /etc/ssh/sshd_configでコンフィグ編集を行います。

sshd_config

# 同じ項目が既に入っていればそちらはコメントアウトしてください。

# SSHの初期ポート番号は狙われやすいので必ず変更する
Port 22
# Port 好きなポート番号

# パスワード無しでのログインは絶対に許可してはならないので"no"
PermitEmptyPasswords no

# チャレンジレスポンス認証を使用しない
ChallengeResponseAuthentication no

# Rootでのログインはセキュリティ上よろしくないので"no"
PermitRootLogin no

# ログインの成功失敗ログが出力されるようにする
SyslogFacility AUTHPRIV

# 出力されるログを詳細なものに切り替える
LogLevel VERBOSE

# PAM(Pluggable Authentication Module)認証。パスワードやチャレンジレスポンスは使わないので"no"
UsePAM no

# 鍵認証のみを使いたいのでパスワード認証は"no"
PasswordAuthentication no

# TCPポートフォワーディングを禁止する(SSH経由で別サーバとの接続を行う場合は"yes")
AllowTcpForwarding no

# Unixドメインソケットによる転送を禁止する(SSH経由で別サーバとの接続を行う場合は"yes")
AllowStreamLocalForwarding no

# X11フォワーディングを禁止する(-Xオプションを使う場合は"yes")
X11Forwarding no

#
# 以下の項目は間違えると修正するまでSSH接続ができなくなるので注意
#
# 接続を許可するユーザを設定(任意)
# AllowUsers yamada
# AllowUsers tanaka@192.168.1.*
# AllowUsers *@192.168.1.2

# 接続を許可するグループを設定(任意)
# AllowGroups hogehoge

# 接続を拒否するユーザを設定(任意)
# DenyUsers ec2-user
  1. 入力が完了した後は$ sudo service sshd restartでSSHを再起動させます。

この時点でSSHのポート番号を変更していれば、次のログインからはそのポート番号でしかログインできません。

UFWの設定

SSHのために様々な変更を行いましたが、さらなるセキュリティ対策を行うためにUFW(Uncomplicated FireWall)というファイアウォールの設定も追加しておきましょう。

  1. まずは$ sudo ufw default DENYですべてのポートを拒否します。この時点ではまだ有効になっていないのですぐに遮断されることはありません。

  2. 次に$ sudo ufw allow SSHポート番号で先程指定したSSHポート番号を許可します。

  3. 更に$ sudo ufw limit SSHポート番号を加えることで、30秒間に6回以上のアクセスが同一IPから行われた場合、そのIPをブロックできます。

  4. そして$ sudo ufw enableによってUFWが起動されます。

    1. Command may disrupt existing ssh connections. Proceed with operation (y|n)?という文言(コマンドが既存のSSH接続を中断する可能性)が出てくることがありますが、大抵は問題ありませんのでy(yes)を選びます。
  5. 最後に$ sudo ufw reloadで設定を反映させます。

SFTPの設定

次はSFTP(SSH File Transfer Protocol)の設定を行います。

FTPとはクライアントとサーバ間で、ファイルのアップロードやダウンロードを行うことのできる便利な機能であり、自身の端末にあるファイルをサーバに送ったり、サーバ側のファイルをこちらに受信することが可能となります。

SFTPとはSSHにFTP機能を加えたプロトコルであり、よりセキュアにファイルの送受信を行うことができます。

通常のFTPサーバにはvsftpd(Very Secure FTP Daemon)と呼ばれるオープンソースの著名なFTPサーバがあります。

ただし、SFTPではsftp-server(もしくはinternal-sftp)というシステムが使われており、FTPとは動作するプログラムが異なります(vsftpdの設定を行ってもSFTPには意味が無い)。

今回の導入後、実際のFTP接続には非常に扱いやすい無料のFTPクライアントソフトウェアであるFileZillaを使います。事前にダウンロードしておきましょう。

SFTP専用ユーザの追加

今回の設定ではSFTPでのみログインができるユーザを新たに作成します。

※もし使うのが管理者のみで他のユーザが必要とならない場合はユーザ追加の設定は行わなくてもOKです。

  1. $ sudo useradd ユーザ名でSFTP用ユーザを作成します。ユーザ名は各自決めてください。

  2. 次に$ sudo passwd ユーザ名で先程作成したユーザにパスワードを作成します。

  3. そして$ sudo usermod -d / ユーザ名により、そのユーザのホームディレクトリを/に設定します。

  4. その後$ sudo mkdir /home/ユーザ名およびsudo chown root:root /home/ユーザ名$ sudo chmod 755 /home/ユーザ名で作成したユーザが読み書き可能なディレクトリを作成します。

  5. それが完了すると、$ sudo groupadd グループ名でSFTP専用ユーザのグループ名を作成します。こちらも名前は自由です。

    1. $ id ユーザ名で現在のグループをチェックできます。
  6. 現時点では作成したユーザが同じく新規に作ったグループに属していないため、$ sudo usermod -G グループ名 ユーザ名でグループ設定を変更させます。

    1. 後に同じ権限を持ったユーザを更に追加したくなった場合は、ユーザ作成後、同様の方法でグループ設定を変更すればOKです。
  7. このままでは作成したユーザは読み書きができないため、$ cd /home/ユーザ名で移動後、$ sudo mkdir testでディレクトリを作成し、更に$ sudo chown ユーザ名:ユーザ名 testで権限を与えます。

  8. 最後に$ sudo vim /etc/ssh/sshd_configでグループに対しての動作を指定します。

    1. 鍵認証を行う場合はSSH接続のセクションと同じ方法で鍵を作成し、指定された場所に公開鍵を設置してください。

sshd_config

# 末尾に記述する
# 指定したグループに対しての設定
Match group グループ名

  # 初期ディレクトリを指定
  ChrootDirectory /home/%u

  # コマンド強制でSFTP接続のみを許可し、chroot対応しやすいinternal-sftpを使う
  ForceCommand internal-sftp

  # パスワード認証を行う場合は"yes"
  PasswordAuthentication yes

  # 鍵認証を行う場合はキーの場所を指定(%uはそれぞれのユーザ名を意味する)
  # AuthorizedKeysFile /home/%u/.ssh/authorized_keys
  
  # TCPポートフォワーディングを禁止する(SSH経由で別サーバとの接続を行う場合は"yes")
  AllowTcpForwarding no

  # Unixドメインソケットの転送を禁止する(SSH経由で別サーバとの接続を行う場合は"yes")
  AllowStreamLocalForwarding no

  # X11フォワーディングを禁止する(-Xオプションを使う場合は"yes")
  X11Forwarding no
  1. すべての設定が完了したため、$ sudo service sshd restartにより、sshdを再起動させます。

もしコマンドでSFTPログインを行いたい場合はsftp ユーザ名@IPアドレスを入力します。

鍵認証でのSFTPログインコマンドはsftp -i /公開鍵の場所/ ユーザ名@IPアドレスです。

FileZillaで接続する

  1. まずFileZillaを起動した後、ファイルサイトマネージャーの順で選択します。

  2. すると、サイトマネージャーの項目が出てくるので、左下にある新しいサイトを選択します。

  3. 選択後、自分のサイトに新規サイトが現れるので、右上の一般タブ内のプロトコルに使用するタイプを選びます(FTP,SFTP,FTPS)。

  4. ホストはサーバのIPを入力してください。

  5. ポートは設定したポート番号を入力します。

    1. SFTPの場合はSSH接続に使うポート番号を入力します。
    2. 通常FTPの場合(vsftpdなど)は設定したlistenポート番号を入力します。
  6. その後、ユーザーにはログインを行うユーザ名を入力します。パスワードはそのユーザ名に設定したパスワードを入力します。

    1. もしパスワード認証を無効化している場合は、後述する鍵認証を使ったSFTP接続を参照してください。
  7. 右下部にある接続を選択することで、サーバに接続が開始されます。ユーザ名およびパスワードが間違っていなければ無事接続成功となります。

    1. もしユーザ名とパスワードが間違っていないのにエラーが発生する場合は、FTPサーバの設定が間違っている可能性があります。左上のログにエラー文が表示されるので、それを参考に調べてみてください。
  8. あとはユーザの権限次第でサーバへの読み書きや転送などを行うことが可能です。

鍵認証を使ったSFTP接続

ここまでの設定ではSSH接続によるログインは公開鍵と秘密鍵を使っています。

これをそのまま利用することで、FileZillaでもSFTP接続することができます。

  1. まずはFileZillaメニューバーの編集設定を選んで設定画面を表示します。

  2. 次に表示されたページの種類一覧でSFTPを選択します。

  3. 右側に公開鍵認証の項目が表示されるので、鍵ファイルの追加を選んでください。

  4. 秘密鍵が格納されたファイルを選択が出てきますが、ここでSSH接続に使っているid_ed25519を選択し開くを選びます。

    1. 秘密鍵の方を選ぶ必要があるので注意(.pubは公開鍵なので誤り)。
  5. すると、FileZilla はファイル「id_ed25519」の形式をサポートしていません。FileZilla がサポートしている形式に変換しますか?というダイアログが出てくるので、はいを選択します。

    1. 秘密鍵にパスワードを入力した場合はここでパスワードが求められますので入力します。
  6. その後PuTTY private key files(*.ppk)という形式で保存することができるので、認識のディレクトリに保存します(例:id_ed25519.ppkで保存)

  7. 保存が完了したらOKを選んで設定画面を閉じます。

  8. 再びサイトマネージャーへ戻り、自身のサイトの一般タブ内のログオン タイプ鍵ファイルに切り替えます。

  9. ユーザーの下が鍵ファイルに変更されているので、参照を選んで先程保存した.ppkファイルを選びます。

  10. すべての設定が完了したので接続を選択してサーバに接続します。

    1. 不明なホスト鍵というダイアログが出てきますが、誤りが無ければそのままOKで問題ありません。
    2. 秘密鍵にパスワードを設定していれば、パスワードの入力を要求されるため、秘密鍵に対するパスワードを入れてください。

これにより、鍵認証を使ったSFTP接続ができるようになりました。

【予備】FTPの導入

以前のサイトではSFTPではなくFTP(実際にはFTPS)を使っていたこともあり、予備としてこちらの導入方法も置いておきます。

ただし、FTPS(File Transfer Protocol over SSL/TLS)やSFTPではなく、通常のFTPの場合は通信が暗号化されていないため、実際に使うのならFTPSあるいはSFTPが推奨されます。

  1. まずは $ sudo apt updateでアップデートを確認します。

  2. 次に$ sudo apt install vsftpdでvsftpdをインストールします。

  3. $ vsftpd -vでインストールしたvsftpdのバージョンをチェックできます。

  4. $ sudo vim /etc/vsftpd.confで各種設定を記述していきます。

vsftpd.conf

# 同じ項目が既に入っていればそちらはコメントアウトしてください。

# IPV4での接続を有効にする
listen=YES

# IPv6での接続を拒否
listen_ipv6=NO

# 匿名ログインを許可しない
anonymous_enable=NO

# ローカルユーザのログインを許可する
# (/etc/passwdに存在するユーザ)
local_enable=YES

# ファイルの変更を許可
write_enable=YES

# 新規ファイルのumaskパーミッション設定(002の時、ディレクトリは775、ファイルは664となる)
# ディレクトリ - 777からumaskを引いた数値(000では777)。
# ファイル - 666からumaskを引いた数値(077では600)。
local_umask=002

# メッセージファイルがあるディレクトリにアクセスするとそのメッセージを表示する
dirmessage_enable=YES

# ファイル送受信のログを記録する
xferlog_enable=YES

# xferlog形式のフォーマットを利用せず、vsftpd.logに変更
xferlog_std_format=NO

# ログ出力パス
vsftpd_log_file=/var/log/vsftpd.log

# Activeモード時のデータコネクションポートを20番に固定するかどうかの設定
connect_from_port_20=NO

# ASCIIモードでのアップロードを許可
ascii_upload_enable=YES

# ASCIIモードでのダウンロードを許可
ascii_download_enable=YES

# FTPサーバ接続時に表示するメッセージ
ftpd_banner=Welcome to blah FTP service.

# ディレクトリアクセスの制御(CHangeRoot)リストを有効化
chroot_list_enable=YES

# chroot_list_fileで指定したユーザのみ全ディレクトリへのアクセスを可能とする
# "NO"の場合は指定されていないユーザが全ディレクトリへのアクセスができる(NOは非推奨)
chroot_local_user=YES

# 指定するユーザのリスト
chroot_list_file=/etc/vsftpd.chroot_list

# chroot先に書き込み権限があるユーザはログイン不可、"YES"だと権限有りでログイン可能に
# セキュリティ的には悪用防止のためにユーザの書き込み権限を無しにしつつ"NO"が良い
allow_writeable_chroot=YES

# ディレクトリの再帰表示を許可
ls_recurse_enable=YES

# ログイン可否を設定するユーザリストを有効化する
userlist_enable=YES

# "NO"ではユーザリストに書かれたユーザのみログイン可能にする(ホワイトリスト制)
userlist_deny=NO

# ユーザリストのパス
userlist_file=/etc/vsftpd.user_list

# TCP wrappersを使ってアクセス制御を行う
tcp_wrappers=YES

# ディレクトリリストの表示にローカルのタイムゾーンを使用
use_localtime=YES

# ログイン時ディレクトリ(ホームとなるディレクトリ)
local_root=/home

# FTPもしくはFTPS接続に使用するポート番号(自由に決める)
listen_port=10000
# pasvモードで利用するポート最小値(自由に決める)
pasv_min_port=10010
# pasvモードで利用するポートの最大値(自由に決める)
pasv_max_port=10020

# "500 OOPS:priv_sock_get_cmd"というエラーが出た場合、最終行に追記する
# seccompフィルターを無効にする
# seccomp_sandbox=NO

#
# FTPS設定 (FTPSを使う時だけ有効化する)
# 

# FTPSを有効化
#ssl_enable=YES

# FTPSに使う証明書の場所を指定
#rsa_cert_file=/etc/letsencrypt/live/yourdomain.example.com/fullchain.pem
#rsa_private_key_file=/etc/letsencrypt/live/yourdomain.example.com/privkey.pem

# 匿名接続でのログインにSSL/TLSを使わない
#allow_anon_ssl=NO

# ローカルユーザのデータ通信にSSL/TLSを使う
#force_local_data_ssl=YES

# ローカルユーザのログインにSSL/TLSを使う
#force_local_logins_ssl=YES

# SSL/TLSのバージョン指定(安全性のためTLS1.2以降の使用を推奨)
#ssl_sslv2=NO
#ssl_sslv3=NO
#ssl_tlsv1=NO
#ssl_tlsv1_1=NO
#ssl_tlsv1_2=YES

# SSL/TLSでの暗号強度を高いものにする
#ssl_ciphers=HIGH

# SSL/TLSでの暗号化方式を指定
#ssl_ciphers=ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384

# DH鍵交換パラメータ(各自用意する)
#dh_param_file=/etc/vsftpd/dhparam.pem

# implicitモード(接続直後にSSL/TLSを有効化)を有効化
#implicit_ssl=YES

# すべての接続でクライアント証明書を掲示させる
#require_cert=YES

# SSL/TLS接続時に証明書を要求する
#ssl_request_cert=YES

# すべてのクライアント証明書を検証する
#validate_cert=YES

# クライアント証明書を検証および読み込むためのファイル名
#ca_certs_file=/etc/pki/vsftpd_self_CA/cacert.pem

# OpenSSL接続の診断をvsftpdログに出力する
#debug_ssl=YES
  1. $ sudo vim /etc/vsftpd.chroot_listでchrootユーザリストを作成します。

    1. ファイル内は1行につき1ユーザで記述します。
  2. 今度は$ sudo vim /etc/vsftpd.user_listでログインユーザリストを作成します。

    1. こちらも同様に1行につき1ユーザです。
  3. 設定後、FTPに使うポートをUFWで許可させます。

    1. 例では$ sudo ufw allow 10000です。

    2. pasv接続に使うポートも開放します。

      1. 例:$ sudo ufw allow 10010:10020/tcp
  4. 設定が終われば$ sudo service ufw reloadおよび$ sudo service vsftpd restartで設定を反映させます。

これによりFTP接続ができるようになりました。

次回はNginxの導入と設定およびHTTPS化

これまでの設定によって、SSH接続からFTP接続までが自由に使えるようになるので、ある程度は基本的なサーバとしての運用が可能となります。

次回はウェブサーバであるNginxおよびHTTPS双方の導入と設定について紹介していきます。

参考資料