ウェブサイト検索

Ubuntu 20.04/18.04 および 16.04 でのサーバーの初期セットアップ


このチュートリアルでは、サーバーのセキュリティと信頼性を高めるために、新しくインストールされたUbuntuサーバーで構成する必要がある最初の基本手順について説明します。

このトピックで説明する構成は、基盤となる OS プラットフォーム、Ubuntu がベアメタル サーバー、プライベート仮想マシン、仮想マシンのいずれにインストールされているかに関係なく、すべての Ubuntu サーバー システムでほぼ同じです。 VPS パブリック クラウドでスピンアウトされました。

要件

  • Ubuntu 20.04サーバーのインストール
  • Ubuntu 18.04サーバーのインストール
  • Ubuntu 16.04サーバーのインストール

Ubuntu システムのアップデートとアップグレード

Ubuntu サーバーの新規インストールまたは新しく展開された Ubuntu VPS の場合に注意する必要がある最初のステップは、システムとすべてのシステム コンポーネント (以下のようなもの) を確認することです。カーネル、apt パッケージ マネージャー、およびその他のインストールされているパッケージはすべて、最新のリリース バージョンとセキュリティ パッチによって最新の状態になっています。

Ubuntu サーバーを更新するには、root 権限を持つアカウントでサーバーのコンソールにログインするか、root として直接ログインし、以下のコマンドを実行して更新とアップグレードのプロセスを実行します。

sudo apt update 

update コマンドを実行すると、アップグレード プロセスに使用可能なパッケージの数と、パッケージのアップグレードの一覧表示に使用されたコマンドが表示されます。

sudo apt list --upgradable

アップグレードに利用可能なパッケージのリストを確認した後、以下のコマンドを発行してシステム アップグレード プロセスを開始します。

sudo apt upgrade

ローカルにダウンロードされたすべての deb パッケージとその他すべての apt-get キャッシュを削除するには、以下のコマンドを実行します。

sudo apt autoremove
sudo apt clean

Ubuntuで新しいアカウントを作成する

デフォルトでは、セキュリティ対策として、Ubuntu では root アカウントが完全に無効になっています。システム上に新しいアカウントを作成するには、root 権限を持つアカウント ユーザーでシステムにログインし、以下のコマンドを使用して新しいアカウントを作成します。

この新しいアカウントには、sudo コマンドを介して root 権限が付与され、システム内で管理タスクを実行するために使用されます。このアカウントを保護するには、必ず強力なパスワードを設定してください。 adduser プロンプトに従って、ユーザーの詳細とパスワードを設定します。

sudo adduser ubuntu_user

このアカウントが別のシステム管理者に割り当てられる場合は、次のコマンドを発行して、最初のログイン試行時にユーザーにパスワードの変更を強制できます。

sudo chage -d0 ubuntu_user

現時点では、新しく追加されたユーザーは sudo ユーティリティを介して管理タスクを実行できません。この新しいユーザー アカウントに管理者権限を付与するには、以下のコマンドを実行して、ユーザーを「sudo」システム グループに追加する必要があります。

sudo usermod -a -G sudo ubuntu_user

デフォルトでは、「sudo」グループに属するすべてのユーザーは、sudo ユーティリティを介して root 権限でコマンドを実行できます。以下の例に示すように、実行に必要なコマンドを記述する前に Sudo コマンドを使用する必要があります。

sudo apt install package_name

システムにログインし、sudo をプレフィックスとして付けたapt update コマンドを実行して、新しいユーザーに root 権限が付与されているかどうかをテストします。

su - ubuntu_user
sudo apt update

Ubuntu でシステムのホスト名を構成する

通常、マシンのホスト名は、システムのインストール プロセス中、または VPS がクラウドに作成されるときに設定されます。ただし、サーバーの宛先をより適切に反映するため、またはサーバーの最終目的をより適切に説明するために、マシンの名前を変更する必要があります。

大企業では、データセンターのラック内のマシンを簡単に識別できるように、複雑な命名スキームに基づいてマシンに名前が付けられます。たとえば、Ubuntu マシンがメール サーバーを動作させる場合、マシンの名前はこの事実を反映する必要があり、マシンのホスト名をたとえばmx01.mydomain.lan として設定できます。

マシンのホスト名に関する詳細を表示するには、次のコマンドを実行します。

hostnamectl

マシンの名前を変更するには、以下の抜粋に示すように、マシンに設定する新しい名前を指定してhostnamectl コマンドを発行します。

sudo hostnamectl set-hostname tecmint

以下のコマンドのいずれかを使用して、システムの新しい名前を確認します。

hostname
hostname -s
cat /etc/hostname 

Ubuntu で公開キー認証を使用して SSH をセットアップする

Ubuntuサーバーのシステムセキュリティ度を高めるには、ローカルアカウントにSSH公開キー認証を設定する必要があります。 SSH キー ペア、公開キーと秘密キーを生成するには、キーの長さ (2048 ビットなど) を指定して、サーバー コンソールで次のコマンドを実行します。

SSH キーを設定しているユーザーでシステムにログインしていることを確認してください。

su - ubuntu_user
ssh-keygen -t RSA -b 2048

キーの生成中に、 キーを保護するためにパスフレーズを追加するように求められます。 SSH サーバー経由でタスクを自動化する場合は、強力なパスフレーズを入力するか、パスフレーズを空白のままにすることを選択できます。

SSH キーが生成されたら、以下のコマンドを実行して公開キーをリモート サーバーにコピーできます。公開キーをリモート SSH サーバーにインストールするには、リモート サーバーにログインするための適切な権限と資格情報を持つリモート ユーザー アカウントが必要です。

ssh-copy-id remote_user@remote_server

公開キー認証方式を使用して、SSH 経由でリモート サーバーに自動的にログインできるはずです。 SSH 公開キー認証を使用する場合は、リモート ユーザーのパスワードを追加する必要はありません。

リモート サーバーにログインしたら、以下のスクリーンショットに示すように、ssh リモートでログインしているユーザーを一覧表示するw コマンド などのコマンドの実行を開始できます。

コンソールに「exit」と入力して、リモート SSH セッションを閉じます。

ssh remote_user@remote_server
w
exit

公開 SSH キーの内容を確認してリモート SSH サーバーにキーを手動でインストールするには、次のコマンドを実行します。

cat ~/.ssh/id_rsa.pub

Ubuntu の安全な SSH サーバー

SSH デーモンを保護するには、デフォルトの SSH ポート番号を 22 から 1024 より大きいランダムなポートに変更し、root アカウントへのリモート SSH アクセスを禁止する必要があります。パスワードまたはキーを変更するには、SSH サーバーのメイン設定ファイルを開いて次の変更を加えます。

sudo vi /etc/ssh/sshd_config

まず、コメント行 #Port22 を検索し、その下に新しい行を追加します (リスニング ポート番号は適宜置き換えてください)。

Port 2345

ファイルを閉じずに、下にスクロールして #PermitRootLogin yes という行を検索し、行の先頭から # 記号 (ハッシュタグ) を削除して行のコメントを解除します。以下の抜粋に示すように行を変更します。

PermitRootLogin no

その後、SSH サーバーを再起動して新しい設定を適用し、新しいポート番号を介して root アカウントでリモート マシンからこのサーバーにログインして構成をテストします。 SSH 経由の root アカウントへのアクセスは制限する必要があります。

sudo systemctl restart sshd

また、netstat またはss コマンドを実行し、grep コマンドで出力をフィルタリングして、SSH サーバーの新しいリスニング ポート番号を表示します。

sudo ss -tlpn| grep ssh
sudo netstat -tlpn| grep ssh

状況によっては、一定期間非アクティブな状態が続いた後、サーバーに確立されたすべてのリモート SSH 接続を自動的に切断したい場合があります。

この機能を有効にするには、以下のコマンドを実行します。これにより、TMOUT bash 変数がアカウントの .bashrc 隠しファイルに追加され、その名前で行われるすべての SSH 接続が強制されます。ユーザーは 5 分間非アクティブな状態が続くと切断またはドロップアウトされます。

echo 'TMOUT=300' >> .bashrc

tail コマンドを実行して、.bashrc ファイルの末尾に変数が正しく追加されているかどうかを確認します。今後、非アクティブ状態が 5 分間続くと、後続のすべての SSH 接続が自動的に閉じられます。

tail .bashrc

以下のスクリーンショットでは、ubuntu_user アカウントを介した drupal マシンから Ubuntu サーバーへのリモート SSH セッションがタイムアウトになり、5 分後に自動ログアウトされます。

Ubuntu ファイアウォール UFW を構成する

ネットワーク レベルでシステムを保護するには、すべてのサーバーに適切に構成されたファイアウォールが必要です。 Ubuntu サーバーはUFW アプリケーションを使用してサーバー上の iptables ルールを管理します。

以下のコマンドを実行して、Ubuntu の UFW ファイアウォール アプリケーションのステータスを確認します。

sudo systemctl status ufw
sudo ufw status

通常、UFW ファイアウォール デーモンは Ubuntu サーバーで稼働していますが、デフォルトではルールは適用されません。システムで UFW ファイアウォール ポリシーを有効にする前に、まず、変更された SSH ポートを介して SSH トラフィックがファイアウォールを通過できるようにする新しいルールを追加する必要があります。以下のコマンドを実行することでルールを追加できます。

sudo ufw allow 2345/tcp

SSH トラフィックを許可した後、次のコマンドを使用して UFW ファイアウォール アプリケーションを有効にして確認できます。

sudo ufw enable
sudo ufw status

HTTP サーバー、メール サーバー、その他のネットワーク サービスなど、その後サーバーにインストールされる他のネットワーク サービスに新しいファイアウォール ルールを追加するには、以下のファイアウォール コマンドの例をガイドとして使用してください。

sudo ufw allow http  #allow http traffic
sudo ufw allow proto tcp from any to any port 25,443  # allow https and smtp traffic

すべてのファイアウォール ルールを一覧表示するには、以下のコマンドを実行します。

sudo ufw status verbose

Ubuntuサーバー時間の設定

Ubuntu サーバーのクロックおよびその他の関連する時間設定を制御またはクエリするには、引数を指定せずに timedatectl コマンドを実行します。

サーバーのタイム ゾーン設定を変更するには、まず list-timezones 引数を指定してtimedatectl コマンドを実行して、利用可能なすべてのタイム ゾーンを一覧表示してから、以下の抜粋に示すようにシステムのタイム ゾーンを設定します。

sudo timedatectl 
sudo timedatectl list-timezones 
sudo timedatectl set-timezone Europe/Vienna

新しいsystemd-timesyncd systemd デーモン クライアントを Ubuntu で利用すると、ネットワーク全体でサーバーに正確な時刻を提供し、上位の時刻ピア サーバーと時刻を同期できます。

Systemd のこの新しい機能を適用するには、以下のファイルの抜粋に示すように、systemd-timesyncd デーモン構成ファイルを変更し、地理的に最も近い NTP サーバーを NTP ステートメント行に追加します。

sudo nano /etc/systemd/timesyncd.conf

次の設定を timesyncd.conf ファイルに追加します。

[Time]
NTP=0.pool.ntp.org 1.pool.ntp.org
FallbackNTP=ntp.ubuntu.com

地理的に最も近い NTP サーバーを追加するには、次のアドレスにある NTP プール プロジェクト サーバー リストを参照してください: http://www.pool.ntp.org/en/

その後、Systemd timesync デーモンを再起動して変更を反映し、以下のコマンドを実行してデーモンのステータスを確認します。再起動後、デーモンは新しい NTP サーバー ピアと時刻の同期を開始します。

sudo systemctl restart systemd-timesyncd.service 
sudo systemctl status systemd-timesyncd.service

Ubuntuで不要なサービスを無効にして削除する

Ubuntu サーバーでデフォルトで稼働しているすべての TCP および UDP ネットワーク サービスのリストを取得するには、ss または netstat コマンドを実行します。

sudo netstat -tulpn
OR
sudo ss -tulpn

Ubuntu 16.10 リリース以降、netstat または の出力で明らかなように、デフォルトの DNS リゾルバーは systemd-resolved サービスによって制御されるようになりました。 >ss コマンドです。

次のコマンドを実行して、systemd-resolved サービスのステータスを確認する必要もあります。

sudo systemctl status systemd-resolved.service

systemd-resolved サービスは、有効なすべてのネットワーク インターフェイスにバインドし、ポート 535355 TCP および UDP をリッスンします。

運用サーバー上でシステム解決されたキャッシュ DNS デーモンを実行すると、セキュリティで保護されていない DNS サーバーに対して悪意のあるハッカーによって多数の DDOS 攻撃が実行されるため、危険が伴う可能性があります。

このサービスを停止して無効にするには、次のコマンドを実行します。

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

ss または netstat コマンド を発行して、サービスが停止され無効になっているかどうかを確認します。以下に示すように、systemd によって解決されたリスニング ポート (53 および 5355 TCP および UDP) は、netstat または ss コマンドの出力にリストされるべきではありません。

また、systemd で解決されたすべてのデーモン サービスを完全に無効にし、デフォルトの /etc/resolv.conf ファイルを復元するために、マシンを再起動する必要があります。

sudo ss -tulpn
sudo netstat -tulpn
sudo systemctl reboot

サーバーで実行されるいくつかの不要なネットワーク サービスを無効にしましたが、lxc プロセスや snapd サービスなど、他のサービスもシステムにインストールされて実行されています。これらのサービスは、ps、top、またはpstree コマンドを使用して簡単に検出できます。

sudo ps aux
sudo top
sudo pstree

サーバーで LXC コンテナ仮想化を使用しない場合、または Snap パッケージ マネージャー経由でパッケージ化されたソフトウェアのインストールを開始しない場合は、以下のコマンドを実行して、これらのサービスを完全に無効にして削除する必要があります。

sudo apt autoremove --purge lxc-common lxcfs
sudo apt autoremove --purge snapd

それだけです!これで、Ubuntu サーバーは、Web サーバー、データベース サーバー、ファイル共有サービス、その他の特定のアプリケーションのインストールと構成など、カスタム ネットワーク サービスやアプリケーションに必要な追加ソフトウェアをインストールする準備が整いました。