ZenCash セキュアノード設定 (1) : VPSの準備
*原文(英語)は Blockop ブログ からご覧いただけます。なお、日本の読者向けに修正を施した箇所があります。
Zen のセキュアノード構築に関するチュートリアルである本シリーズは、パート 3 まであります。パート 1 およびパート 2 の内容は全てパート 3 で説明されていますので、サーバー構築の経験が豊富な方はパート 3 からお読みいただいても結構です。
パート 1 およびパート 2 は、パート 3 の内容を詳細に説明した基本的なチュートリアルとなっています。
パート 1 の本稿では、セキュアノードを構築するためのバーチャル・プライベート・サーバー(VPS)に関して解説していきます。VPS はVultr や Linodeといったプロバイダから月額 $2.50(¥280) 程度でレンタルすることができます。セキュアノードを安全に使用できるようにするための VPS 構築に関して、1 VPS あたり1つのセキュアノードを設定することを前提としてみていきます。
他にも、例えばバーチャライゼーションを用いてより大規模なシステム上に複数のノードを構築したり、Raspberry Pi 上にノードを構築するなどといった方法もありますが、以下で説明する方法に従って頂ければセキュアノードの構築に関しては十分です。
VPS をレンタルする
VPS のプロバイダーは数多くあるので、自分の好みのものを使用するとよいでしょう。ここでは例として Linode を用いていきます。理由としては、Linode は世界中にデータセンターを所有しており、コントロールパネルが使いやすく、既存の VPS の(プロセッサーやメモリにおける)アップグレードが非常に簡単だからです。それでは Linode のホームページを開き、VPS の登録を行いましょう。
まず最初に、Linode のスタートガイドを読みましょう。スタートガイドには、本稿よりもたくさんの画像や詳細説明が含まれています。なお、さらに詳細なガイドとして Linodeのドキュメンテーション もあります。あるいは、DigitalOcean社のものを参考にすることもできます。
まず、アカウントに Linode 1024 を追加します:
次に、これをよりわかりやすい名前に変更しましょう:
イメージをデプロイします:
ここではUbuntu 16.04を使います。ルートパスワードを設定したら、これを覚えておいてください。できれば、どこかに書いておくとよいでしょう:
Dashboard 内にある Boot というボタンを押して、VPS を起動させます:
ここで、VPS のIP アドレスを探してください。この Linode の例だと45.79.103.118 となります:
次に、セキュアシェル(SSH)を通じてVPS へ接続する準備をします。方法がわからない場合、こちらを参照してください。
なお、テキストファイルの編集にあたって本稿では vim および nano を用いていきます。vim に関する簡単なガイドは こちらを参照してください。図を用いたガイドとしてはこちら をご覧ください。これはプリントアウトしてもよいでしょう。より簡単なテキストエディタとしては nano をお勧めします。vim には多くのショートカットコマンドが存在し、普通にタイピングする位置に手を置いたままほとんどの操作を行うことができます。したがって、一度操作方法を覚えてしまえば vim は非常に有用なツールとなります。
また、以下で示すコマンドの例では、Mac、Linux PC もしくは Windows PC のBash シェルから操作を行なっているものとします。Windows で Putty もしくは SecureCRT を用いて操作を行なうという場合、結果は大方似通うこととなりますが、全く同じとはなりせん。
それではまず、自分のシステム設定から始めましょう! VPS の名前および IP アドレスを用いて、hostsファイルをアップデートしましょう:
sudo vim /etc/hosts
etc/hosts ファイルの一番下に、VPS に関する基本的な情報を入力してください。これによって、IP アドレスを覚えておく必要がなくなり、VPS の名前だけ記憶しておけば良い状態になります(GG でファイルの一番下へ移動し、o で入力を開始して必要事項を入力し、Esc を押し、:wq を入力して保存します。間違ってしまった場合は、:q! を入力して編集内容を削除してください)。
入力内容としては、IP アドレス、ホスト名の順です。ここでは、以下の内容を /etc/hosts に加えました:
45.79.103.118 znode
次に、ホスト名および VPS への基本的なネットワーク接続がきちんと機能していることを確認するために、ping コマンドを入力します:
ping znode
結果、以下のようになるはずです。Ctrl + C を入力し、ping を終了させましょう:
それでは、VPS に接続していきます。ここでは、先ほど作成したパスワードを入力する必要があります:
結果は以下のようになります。もちろん、この例では最初の2回で誤ったパスワードを入力しています:
ここで、VPS を安全に使用できるように設定を行っていきます。以下のコマンドで、システムをアップデートしましょう:
apt-get update && apt-get -y upgrade
これには少し時間がかかります。なお、VPS を最新の状態にアップデートしておくために、1〜2 週間ごとにこのコマンドを実行することをお勧めします。しかしながら、サーバーシステムをしばらく操作しないという場合、その直前にアップデートは行わないでください。アップグレードを行うことにより不具合が生じ、これらを修正するためにひたすらグーグル検索を行わなくてはならないという事態が生じる可能性があるからです。今回のアップグレードに際しては、システムから質問がなされたので、Tab そしてEnterを押すことによりデフォルトの回答を選択しました:
次に、ホスト名を適切なものへと設定します:
hostnamectl set-hostname znode
次に、システムが自らを探知できるように、hostsファイルを編集します。ここでは、nanoを使用します:
nano /etc/hosts
3行目あたりに、IP アドレスとホスト名を挿入します。完全修飾ドメイン名(FQDN)がわかっている場合、それも入力してください。もしわからないのであれば、とりあえず後回しにしておきます。以下のように入力してください:
45.79.103.118 znode znode.blockoperations.io
次に、タイムゾーンを設定しましょう。これは必須ではありませんが、ログ情報を検証する際に役立ちます。以下のコマンドを入力し、自分が属するタイムゾーンを調べてください。スペースキーを押すことで次のページに移動することができます:
timedatectl list-timezones
タイムゾーンを設定するコマンドは以下のようになります:
timedatectl set-timezone 'America/New_York'
ここで、ユーザーアカウントを追加し、このユーザーに管理者権限を付与します。パスワードに関しては、ルートパスワードと異なるものが望ましいでしょう:
adduser blockops && adduser blockops sudo
ここで、VPS から退出します。ルートユーザーとしてシステムに接続するのはこれが最後となることを祈りましょう…:
exit
次に、ユーザーとしてログインします。ユーザー名および VPS ホスト名を用いてシステムから接続を行い、すぐに接続を切断してみます。今回の例ですと、以下のようになります:
ノードに対し、認証に必要なキーペアをコピーします(まだこの情報は存在していないかもしれませんが、大丈夫です。その場合、あとで見ていきます)。これは必須ではありませんが、非常に有用です。ここで退出して再びログインすると、パスワードを入力する必要がなくなっています!
ssh-copy-id [email protected]
exit
これがうまくいかなかった場合、認証のためのキーペアを作成する必要があります。下記の方法を実行するのは、上述の方法でうまくいかなかった場合のみにしてください!以下のコマンドを入力してください:
ssh-keygen -b 4096
Windows で SSH アプリケーションを使用している場合、この Linode ガイドを参照し、再試行してみてください。次に、VPS のセキュリティを向上させていきます。まず、コンフィグファイルを編集し、ルートユーザーとしてのログインを禁止します。ハッキング被害を防止するため、これは確実に行ってください:
sudo vim /etc/ssh/sshd_config
j キーを用いてスクロールダウンしてください。そして、(おそらく28行目の)コードを以下のように変更してください(l で右へ移動、x で削除、a で入力開始となります。必要事項を入力し、終了したらEsc を押し、:wq を入力してファイルを保存してください):
PermitRootLogin no
変更後のファイルは以下のようになります:
ここで、sshd サービスを再開させます。なお、Linux においては tab を用いてコマンドを入力する機能があるので、コマンド全体の入力が面倒である場合には、tab キーを押してみてください。もし、入力された文字列に続く候補が 1 つのみである場合、残りの文字列が自動で入力されます。下記コマンドで、sshd と入力した後に tab キーを押してみてください:
sudo systemctl restart sshd.service
さて、コンフィグファイルの編集に慣れてきたところでしょうから、これからはスクリーンショットの数を減らし、具体的な指示を増やしていくことにします。今後のために、いくつかの基本的なプログラムをインストールしておきましょう:
sudo apt update
sudo apt -y install git screen vim nmap ncdu busybox inxi links unzip python
また、~/.vimrc を編集することで、vim の見た目をより良いものにしましょう(cd と入力して、適切なディレクトリに移動しましょう)。以下のコマンドを入力してください:
vim .vimrc
以下を挿入して保存し、vimから退出してください:
color desert
bash ログインファイルも編集しましょう:
vim .bashrc
以下の2行を、ファイルの一番下に追加してください:
force_color_prompt=yes
LS_COLORS=$LS_COLORS:'di=0;36:' ; export LS_COLORS
退出し、再度ログインしてください。ターミナルを使用している場合、上向き矢印(↑)キーを利用することで、以前入力したコマンドを呼び戻すことができますので、ぜひ活用してください。
ファイアウォールの設定
これまでで基本的なサーバー設定は終了したので、セキュリティの強化に移ります。まず、ファイアウォールを設定し、いくつかのポートを開いていきます。以下のコマンドをそっくりそのまま(かつ以下の順番通りに)入力し、ファイアウォールの設定を行ってください:
まず、すでにファイアウォールが有効化されているか確かめるため(に、以下のコマンドを入力してください(この時点では、有効化されていない状態であるはずです):
sudo ufw status
注意:以下のコマンドの入力に際しては、必ず順番を守ってください。そうでない場合、プログラムが機能しません!(必要とあらば、sudo ufw disable
によってファイアウォールを無効にしてください)
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow ssh/tcp
sudo ufw limit ssh/tcp
sudo ufw allow http/tcp
sudo ufw allow https/tcp
sudo ufw allow 9033/tcp
sudo ufw logging on
sudo ufw enable
最後のコマンドで、有効化するか否か尋ねられた場合、yes と返答してください。そして、以下のコマンドを用いて、ファイアウォールが有効化されているかどうか確かめてください:
sudo ufw status
すると、ufw が有効化されている旨のメッセージが表示されるはずです。さらに、こちらが意図した通り、ファイアウォールは再起動後も有効化されることになります。
メール設定
sudo apt -y install mailutils postfix
インターネットサイトとホスト名に関して尋ねられたならば、Postfix Mail のデフォルトの回答を選択してください。
また、何か問題が発生した際にメールをしっかりと受け取れるように、エイリアス名を変更しておきましょう。これによってメール設定を簡単に行うことができます。なお、これが大規模なメールサーバーだとメールがブロックされることがあります。また、より複雑で包括的なメール設定方法もありますが、ここではそれを行う必要はありません。ここでPostfix を使用する理由としては、著者自身、この設定方法や使用方法を確実に把握しており、非常に信頼できるソフトウェアだからです。もちろん、他のメールサーバーで Postfix よりも簡単に使えるものもあるでしょう。いずれにしても、エイリアスは設定する必要がありますので、エイリアスファイルを編集することにしましょう:
sudo vim /etc/aliases
以下を、ファイルの一番下に追加してください。メールアドレスは自分のものに置き換えてください:
root: rolf@nullblockoperations.com
以下のコマンドを入力して、エイリアスを有効化してください:
sudo newaliases
ここで、Postfix が起動時に作動し、かつ現時点で作動しているようにしましょう:
sudo systemctl enable postfix
sudo systemctl restart postfix
そして、メールシステムのテストを行います。以下は簡単なテストの例です。メッセージを送信するためには、画像の “test email 1” とある行の後で Ctrl + D を押してください:
これにより、著者のメールアプリケーションにはテストメールが届きました。もしうまくいかないというときは、ログ情報をチェックして原因を確かめてください。Linux が素晴らしいのは、全ての操作に対してログ情報が存在するということです。通常ログ情報は /var/log 内にあり、今回は /var/log/mail.log 内に存在しています。ファイルの内容を見るためには、以下のコマンドを入力してください:
tail -n 100 /var/log/mail.log
変更点:Linode において、Postfix のログ情報属性が変更されたようです。Postfix の設定に関する詳細は、こちらから確認してください。
それでは、次のタスクに移行しましょう。
Fail2Ban を用いた基本的な侵入防止策
ここでは、ネット上の様々な人々が、システムに対して絶え間なく辞書攻撃を行うのを食い止めるための設定を行います。正確には、「食い止める」というよりは「遅らせる」ということになります。同じ IP アドレスからのログインが 10 回失敗した場合、そのIP アドレスは 10分間ログインが行えないようになります。全く無防備であるよりは良いでしょう:
sudo apt -y install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
fail2ban によって実行されている内容が気になる場合は、しばらくの間 fail2log がログ情報をアウトプットするのを眺めてみるとよいでしょう。サーバーというものが素晴らしいのは、この点にあります。すなわち、問題がないときはもちろんのこと、特に問題が発生した際に、ログ情報をしっかりと記録しているのです。Linux においては、これらのログを全て読み取ることができます。fail2ban のログ情報を確認する方法の一つとして、以下のコマンドがあります。この tail アプリケーションを終了させる場合は Ctrl + C を入力してください:
sudo tail -f /var/log/fail2ban.log
以下のアウトプットでは、ログインが禁止された IP アドレスが示されています。なお、10分経過後に、禁止が解除されています:
より多くのメモリを確保するためにスワップ領域を設定する方法(速度は遅いが、時として有用)
VPS の費用はなるべく安く抑えたいものです。同時に、何かをコンパイルしたり、ZenCash においてシールドされたトランザクションを生成するなどといった理由により、サーバーが現行よりも多くのメモリを必要とする場合があります。しかしながら、こうした必要性が頻繁に生じない限り、サーバーをアップグレードすることなく、一時的なメモリとしてハードドライブの領域を使用することで事足りる場合があります。
まず最初に、現在利用可能なハードドライブの領域を確認してみましょう:
df -h
続いて、どれだけのメモリが利用可能であるか確認しましょう:
free -h
ここで、ソリッドステートドライブ(SSD)の領域のいくらかをスワップ領域へと移します。以下のコマンドを入力していきますが、まず最初に sudo li
を入力し、パスワードを打ち込んでください。これによって、以下のコマンドを入力する上でのシステム上の準備が整います:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
メモリを見てみて下さい。スワップ領域により多くのメモリが存在しているのがお分かりかと思います:
ここで、スワップ領域の機能を高めましょう。次のファイルを編集していきます:
sudo vim /etc/sysctl.conf
一番下に、以下を挿入して下さい:
vm.swappiness=10
そして、サーバーが再起動するたびにスワップ領域が利用可能となるように設定しましょう。もしそうでなかっとしたら、今まで行なった設定の意味があまりありません。fstab ファイルを編集していきます:
sudo vim /etc/fstab
一番下に以下を追加して下さい:
/swapfile none swap sw 0 0
これで、VPS において利用可能なメモリ容量がだいぶ増加したことになります。なお、これによってメモリに関する問題が全て解決されたわけではありません。処理速度が遅くなってきたならば、VPS をアップグレードする必要が出てくる可能性もあり、その場合、月額レンタル料は増加することになります。これに関しては Linode ホームページにわかりやすい表があるので、それを参照して下さい。また、top もしくは htop (sudo apt install htop
) を実行することで、VPS の状態を把握することができます。 例えば top を実行すると以下のようになります。多くの役立つ情報を見て取ることができます:
Rootkit Detector のインストールおよび アップグレードスクリプトについて
VPS がハッキングされた場合に、VPS がそれを検知して知らせてくれる役割を果たすものとして、rkhunter があります。rkhunter は、こうした事柄を知らせてくれるための基本的なアプリケーションなのです。 これによって、ハッキングされた場合でもサーバーイメージをきれいに消去した上で、バックアップからデータを復元させることが可能になります。なお、重要サーバーに関しては、Linode において月額$2(¥230程度)のバックアップ機能を付加させて下さい。
rkhunter をインストールし、最初のファイルスキャンを行います:
sudo apt -y install rkhunter
sudo rkhunter --propupd
VPS をアップデートした場合、rkhunter がアップデートファイルを検知できるように、アップデート直後に rkhunter を実行すると良いでしょう。そこで、こうしたことを忘れないように、ちょっとしたスクリプトを書いておきましょう:
vim upgrade_script.sh
以下をファイルに入力して下さい:
#!/bin/bash
sudo apt update
sudo apt -y dist-upgrade
sudo apt -y autoremove
sudo rkhunter --propupd
ファイルを保存したのち、ファイルを実行可能とするようにファイル権限を変更しましょう:
chmod +x upgrade_script.sh
ここで、管理者権限を用いてファイルを実行します:
sudo ./upgrade_script.sh
これで、システムアップグレードにあたってのコマンドを全て覚えておく、という必要がなくなりました! ログインしたのち、このシェルスクリプトを実行するだけで大丈夫です。
お疲れ様です! 非常に多くの作業だったと思いますが、なにはともあれ、これで安全な VPS の準備が完了しました。次に VPS の準備を行う際は、もっと素早く行えるでしょう。
パート 2 では、ZenCash に必要となるアプリケーションのインストールに関してみていきます。
本記事の発信源であるBlock Operations(創設者:Rolf Versluis)に関しては、以下のリンクからご覧ください:
Block Operations YouTube チャンネル