![[サーバ構築編#3] Ubuntu初期設定-ユーザ作成とSSH接続の強化](/_next/image?url=%2Farticles%2Fserver%2Fubuntu-user-ssh%2Fhero.jpg&w=3840&q=75)
サーバ構築編#3Ubuntu初期設定-ユーザ作成とSSH接続の強化
SSHでサーバへ接続して、Ubuntu Server 24.04.1LTSの主にユーザ作成とSSH接続の強化
初回公開日
最終更新日
サーバ構築編第3回からはWebサーバにSSHで接続して、初期設定を進めていきます。
パッケージの更新、ユーザ作成、SSH接続の強化、SSH強化に伴うファイヤーウォールの設定を行います。
サーバ構築編第2回までで作成、設定した下記の内容を利用しますので、事前に用意してください。
- 秘密鍵ファイルとパスフレーズ
- WebサーバのグローバルIP
- デフォルトユーザは
ubuntu
のパスワード
1.初期インストール済みパッケージの更新
SSHでWebサーバへ接続
まず、ローカルPCでWebサーバの公開鍵を作成した際にダウンロードした秘密鍵ファイルを用意します。
秘密鍵ファイルのパーミッションを確認して、
400
でなければchmod
コマンドでパーミションを変更します。
秘密鍵ファイルがローカルPCのホームディレクトリにある場合は下記のコマンドになります。bash
1chmod 400 ~/filename.pem
ホームディレクトリ以外に秘密鍵ファイルがある場合は、パスの
~
部分を変更してご利用ください。
秘密鍵を使ったsshコマンドは下記のようになります。bash
1ssh -i "~/filename.pem" ubuntu@xxx.xxxx.xxx.xxx
私の環境は「さくらのクラウド」なのでデフォルトユーザ
ubuntu
になります。「xxx.xxxx.xxx.xxx」の箇所はWebサーバのグローバルIPになります。
初めて、SSHする際は下記のような警告が出る場合があります。bash
1The authenticity of host 'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)' can't be established.
2ED25519 key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
3This key is not known by any other names.
4Are you sure you want to continue connecting (yes/no/[fingerprint])?
上記のメッセージが表示された際は、「yes」と入力すると次回からは表示されなくなります。
ちなみに上記のメッセージは「SSHクライアントが接続先のサーバのホスト鍵を初めて見るため、その真正性を確認できないという警告」になります。
「yes」を入力すると、一旦コネクションを閉じましたという旨のメッセージが表示されてSSH接続は終了します。
再度、SSHコマンドを実行します。
接続時に下記のようにパスフレーズの入力を求められますので、公開鍵作成時に設定したパスフレーズを入力します。
Enter passphrase for key '/xxxx/xxxxx/filename.pem':
すると、下記のようなWelcomeメッセージが表示されて、SSH接続が完了したことが確認できます。
bash
1Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-55-generic x86_64)
2
3 * Documentation: https://help.ubuntu.com
4 * Management: https://landscape.canonical.com
5 * Support: https://ubuntu.com/pro
パッケージリストの更新
Ubuntuの設定はリポジトリ内のパッケージリストの更新から始めます。
リポジトリやパッケージ、aptコマンドについては、別途下記にまとめていますので参考に...
sudo
コマンドでroot権限でapt
コマンドを利用していきます。下記のコマンドでパッケージリストの更新ができます。bash
1sudo apt update
実行すると管理パスワードを求められるので、サーバ作成時に設定した管理者パスワードを入力します。
すると、下記のようにパッケージリストが更新されます。まだ
ubuntu server
だけしかインストールされていない状態なので、ubuntuのパッチ関連のリストだけが更新されます。bash
1Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
2Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
3Get:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
4Get:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
5Get:5 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Components [151 kB]
6Get:6 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Components [364 kB]
7Get:7 http://security.ubuntu.com/ubuntu noble-security/main amd64 Components [8,980 B]
8Get:8 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Components [212 B]
9Get:9 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Components [940 B]
10Get:10 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Components [208 B]
11Get:11 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Components [20.0 kB]
12Get:12 http://archive.ubuntu.com/ubuntu noble-backports/restricted amd64 Components [216 B]
13Get:13 http://archive.ubuntu.com/ubuntu noble-backports/multiverse amd64 Components [212 B]
14Get:14 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Components [51.9 kB]
15Get:15 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Components [212 B]
16Get:16 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Components [212 B]
17Fetched 976 kB in 2s (431 kB/s)
18Reading package lists... Done
19Building dependency tree... Done
20Reading state information... Done
21138 packages can be upgraded. Run 'apt list --upgradable' to see them.
Run 'apt list --upgradable' to see them.
のbash
1apt list --upgradable
を実行すると下記のように更新が可能なパッケージのリストが表示されます。実際には更新されません。
bash
1Listing... Done
2apparmor/noble-updates 4.0.1really4.0.1-0ubuntu0.24.04.3 amd64 [upgradable from: 4.0.1really4.0.0-beta3-0ubuntu0.1]
3apport-core-dump-handler/noble-updates 2.28.1-0ubuntu3.3 all [upgradable from: 2.28.1-0ubuntu3.1]
4apport/noble-updates 2.28.1-0ubuntu3.3 all [upgradable from: 2.28.1-0ubuntu3.1]
5base-files/noble-updates 13ubuntu10.2 amd64 [upgradable from: 13ubuntu10.1]
6bpftrace/noble-updates 0.20.2-1ubuntu4.3 amd64 [upgradable from: 0.20.2-1ubuntu4]
7bsdextrautils/noble-updates 2.39.3-9ubuntu6.2 amd64 [upgradable from: 2.39.3-9ubuntu6.1]
8bsdutils/noble-updates 1:2.39.3-9ubuntu6.2 amd64 [upgradable from: 1:2.39.3-9ubuntu6.1]
9cloud-initramfs-copymods/noble-updates 0.49~24.04.1 all [upgradable from: 0.48]
10cloud-initramfs-dyn-netconf/noble-updates 0.49~24.04.1 all [upgradable from: 0.48]
11・・以下省略
インストール済みパッケージの更新
続いてパッケージの更新を行います。
bash
1sudo apt upgrade -y
実行すると下記のようにログが展開されます。
bash
1Reading package lists... Done
2Building dependency tree... Done
3Reading state information... Done
4Calculating upgrade... Done
5The following NEW packages will be installed:
6 python3-boto3 python3-botocore python3-dateutil python3-jmespath python3-packaging python3-s3transfer
7
8・・省略・・
9
10Service restarts being deferred:
11 /etc/needrestart/restart.d/dbus.service
12 systemctl restart getty@tty1.service
13 systemctl restart systemd-logind.service
14 systemctl restart unattended-upgrades.service
15
16No containers need to be restarted.
17
18User sessions running outdated binaries:
19 ubuntu @ session #567: apt[29919], sshd[27332]
20 ubuntu @ user manager service: systemd[27342]
21
22No VM guests are running outdated hypervisor (qemu) binaries on this host.
再起動が保留されているサービスや古いバイナリで動いているユーザーセッションが表示されますので、サーバ自体を再起動してしまいます。本番運用中ですと、気軽に再起動はできないので、個別にサービスを再起動して、SSHの再接続することになります。
ここではサーバを再起動
bash
1sudo reboot
しばらくしたら、SSHで再接続します。
2.ユーザ作成
「さくらのクラウド」はデフォルト
ubuntu
になっているので、このまま運用すると危険です。そこで、SSH接続する管理者ユーザを作成します。パスワードルールの強化
早速、ユーザを作成していきたいところですが、まずはパスワードルールを定めます。
SSHは秘密鍵を利用するのですが、管理者権限でコマンドを実行する時などを考慮すると最低限のルール強化を行なっておく方が安全です。
○pwquality.conf でポリシーを設定
パスワードの強度を上げたい場合、
/etc/security/pwquality.conf
を編集します。bash
1sudo vi /etc/security/pwquality.conf
設定例:
bash : pwquality.conf
1minlen = 12 # 最低12文字
2minclass = 4 # 4種類のうち最低4種類を含む(大文字・小文字・数字・記号)
3dcredit = -1 # 最低1つの数字を含む
4ucredit = -1 # 最低1つの大文字を含む
5lcredit = -1 # 最低1つの小文字を含む
6ocredit = -1 # 最低1つの特殊文字を含む
7retry = 3 # adduserとpasswd実行時のリトライ数
設定例(3種類の文字種で構成する場合):
bash : pwquality.conf
1minlen = 12 # 最低12文字
2minclass = 3 # 4種類のうち最低3種類を含む(大文字・小文字・数字・記号)
3dcredit = 0 # 数字を任意
4ucredit = 0 # 大文字を任意
5lcredit = 0 # 小文字を任意
6ocredit = 0 # 特殊文字を任意
7retry = 3 # adduserとpasswd実行時のリトライ数
各設定値はデフォルトでは全てコメントアウトされている状態なので
=0
を設定する場合は、コメントアウト状態のままでも同じ意味となります。
また、ocredit
の特殊文字についてどんな記号が使えるのか調べてみたら、pwquality
はC言語の ispunct()
で記号の判定していました。OS やロケール(LC_CTYPE)によって ispunct() の判定が変わる可能性はありますが、ほとんどの環境では ASCII 標準の下記の記号が使えると思われます。bash
1! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
retry
はユーザ作成時やパスワード変更時に使用されます。パスワードルールで弾かれた時にリトライ可能になるので設定しておくと便利です。
もし、retry = 5
などと設定した場合、/etc/pam.d/common-password
のデフォルト値のretry = 3
との重複が問題になります。
/etc/pam.d/common-password
のretry
はパスワード変更時に利用されるルールですが、/etc/security/pwquality.conf
のretry
よりも優先されます。
したがって、基本的に/etc/security/pwquality.conf
でretry
を設定した場合は、/etc/pam.d/common-password
側のretry
は削除しておきます。bash
1sudo vi /etc/pam.d/common-password
diff : common-password
1- password requisite pam_pwquality.so retry=3
2+ password requisite pam_pwquality.so
○faillock.conf でログイン失敗制限
もう一点、ログイン失敗時の制限も付け加えます。多くのサーバーでは、パスワードの試行回数を制限するのがベスト。
/etc/security/faillock.conf
でその制限が行えます。bash
1sudo vi /etc/security/faillock.conf
設定例:ログインや
su
コマンドのユーザ切り替えで、5回連続で間違えると、10分間ログインできなくなる!bash : faillock.conf
1deny = 5 # 5回失敗でアカウントをロック
2unlock_time = 600 # 10分間ロック
○sudoコマンドにもパスワード失敗制限を適用
注意! この設定は管理者が一人だけの場合、ロックがかかり操作できなくなる可能性があります。複数の管理者がいるか、「さくらのクラウド」のように別途管理画面のコンソールでログインできる状態である場合にのみ、進めることをお勧めします
デフォルトの状態ですと
sudo
コマンド時のパスワードチェックには失敗制限は適用されません。
sudo
にもfaillockを適用するには、下記のようにします。/etc/pam.d/sudo
に pam_faillock.so を追加bash
1sudo vi /etc/pam.d/sudo
下記の2行を
@include common-auth
の直前に追加bash : sudo
1・・省略・・
2
3# ここから追加!
4auth required pam_faillock.so preauth
5auth required pam_faillock.so authfail
6# ここまで追加!
7
8@include common-auth
○faillock.conf でログイン失敗時のロック状態を確認
bash
1faillock #自分がロック状態かを確認
2
3sudo faillock #ロック状態のユーザリストを表示
○faillock.conf でログイン失敗時のロック状態を解除
bash
1sudo faillock --user <ロックされたユーザー名> --reset
管理ユーザの作成
ubuntu
ユーザはデフォルトユーザとして一般に知られているユーザです。このままでは、セキュリティ的にあまりに脆弱なので、別途管理者ユーザを作成して、最終的にubuntu
ではSSH接続できないようにしていきます。あれ?
root
については? という方はこちらも参考にしてください。
ユーザubuntu
とroot
の違いユーザ名の規則は特に設けないのですが、区切りがある場合はアンダースコアを用いることにしています。シェルやコマンドラインでの使用が多い場合は、アンダースコアを使用する方が無難です。ハイフンだとエスケープしないといけない場面が出てくるので面倒です。
▼ユーザ作成のコマンド
bash
1sudo adduser --gecos "" username
username
のところを任意のユーザ名に変えて利用してください。上記を実行するとパスワードを聞かれるので設定します。
--gecos ""
は「Full Name」などのGECOSフィールドの入力をあらかじめスキップするためのオプションです。▼作成したユーザを
sudo
が使える管理者にするbash
1sudo usermod -aG sudo username
3.SSH接続の強化
SSH接続を公開鍵認証のみにして、秘密鍵ファイルを持たないユーザは接続できないようにします。
公開鍵認証用のファイルを設置
ubuntu
ユーザのホームディレクトリにある認証ファイルをssh共通領域に持ってきます。bash
1sudo cp /home/ubuntu/.ssh/authorized_keys /etc/ssh/authorized_keys
cp
すると下記のパーミッションと所有者となっていると思います。bash
1-rw------- 1 root root 382 Mar 11 16:47 authorized_keys
下記のコマンドでパーミッションを変更しましょう。
bash
1sudo chmod 644 /etc/ssh/authorized_keys
SSH の公開鍵認証では、sshd(SSHサーバー)が authorized_keys を参照して認証を行います。各ユーザがSSH接続した際にそのユーザが
authorized_keys
を読めないと秘密鍵での認証ができないので読み取り自体は誰でもできるようにしてしまいます。sshd_config
を変更
bash
1sudo vi /etc/ssh/sshd_config
bash : sshd_config
1AllowGroups sudo
2AuthorizedKeysFile /etc/ssh/authorized_keys
3PasswordAuthentication no
4UseDNS no
sshd_config
ファイルは、初期状態では、ほとんどがコメントアウトされています。コメントアウトを外したり、追記したりして編集します。AllowGroups sudo
はsudo
グループに所属するユーザだけにSSHを許可! 特に制限を加えない場合は不要です。AllowUsers
を利用すると、ユーザ単位で許可できますが、運用が大変なのでグループ単位での管理にしています。AuthorizedKeysFile /etc/ssh/authorized_keys
にすることで、すべてのユーザーがこの鍵を使う!PasswordAuthentication no
にすることで、秘密鍵なしではSSHログイン不可! これはコメントアウトを外すだけ。UseDNS no
にすることでSSHログインの高速化(DNSの逆引き処理がなくなる)これもコメントアウトを外すだけ。
下記のコマンドでsshサービスを再起動します。
bash
1sudo systemctl restart ssh
再起動したら、実際に作成したユーザでSSH接続できるか試します。試す時はユーザ
ubuntu
でSSH接続しているコンソールはそのままで、別途コンソールを立ち上げて試すと、何かトラブルがあっても修正しやすいです。bash
1ssh -i "~/filename.pem" username@xxx.xxx.xxx.xxx
xxxx.xxxx.xxx.xxx
はサーバのグローバルIPです。
ここまでデフォルトユーザubuntu
のSSH 接続を禁止して、SSHのポートも変更
再度、
/etc/ssh/sshd_config
を編集します。bash
1sudo vi /etc/ssh/sshd_config
下記を追加します。わかりやすく
AllowGroups sudo
の下にでも追加します。bash : sshd_config
1DenyUsers ubuntu
DenyUsers
の設定はAllowGroups
よりも優先します。また、接続ポート番号も変更しておきます。
1024番以下のポートは特権ポートなので、1024以上のポート番号を選ぶのが無難です。
設定例:
bash : sshd_config
1#Port 22 ← ここの `#` を外して変更!
2Port 2222
まだ、SSHサービスの再起動はしません。
UFW(Uncomplicated Firewall)の有効化
UFW(ファイアウォール)でポートの開放や閉鎖が簡単にできます。
デフォルトでインストールされてはいますが、有効化はされていないと思います。
まずはUFWを有効化する前に先に、既存の
22
と新しく設定したいポート番号(例:2222
)を許可します。
そうしないとUFWを有効化した時にSSH接続が切断されてしまいます。bash
1sudo ufw allow 22/tcp
2sudo ufw allow 2222/tcp
その後に、下記でUFWを有効化します。
bash
1sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
とSSHが切断される可能性を聞かれますが、すでにポートの解放を設定したので、y
と回答します。下記でUFWのステータスを確認します。
bash
1sudo ufw status
ポートが有効になっていることが確認できます。
ここで、SSHサービスを再起動します。
bash
1sudo systemctl restart ssh
sshのポート番号が変更されているか確認します。
bash
1sudo ss -tlnp | grep ssh
私の環境ではここで問題が発生しました。
bash
1LISTEN 0 4096 *:22 *:* users:・・・・
上記のように22番ポートのまま。。
色々と試したのですが、下記で解消しました。
bash
1sudo systemctl daemon-reexec
2sudo systemctl restart ssh
systemd のキャッシュが影響している可能性を疑い、
systemctl daemon-reexec
というsystemd 自体を再実行し、全ての管理プロセスを最新の状態にリロードするコマンドを実行して、再度SSHサービスを再起動させてみたところ、下記のようにSSHが2222
番ポートで動くことが確認できました。bash
1sudo ss -tlnp | grep ssh
2LISTEN 0 128 0.0.0.0:2222 0.0.0.0:* ・・・
3LISTEN 0 128 [::]:2222 [::]:* ・・・
しっかりと新ポートに切り替わったことを確認しておくと安心です。
新しいユーザで新しいポートでSSH接続
別途コンソールを立ちげてSSH接続を試します。新しく設定したポートが2222の場合は下記のようなコマンドになります。
bash
1ssh -p 2222 -i "~/filename.pem" username@xxx.xxx.xxx.xxx
-p
でポートを指定、xxxx.xxxx.xxx.xxx
はサーバのグローバルIPです。新設したポートでSSH接続をして、問題なく接続できることを確認してください。
使用しなくなった22番ポートを閉じる
最後に不要になった22番ポートを閉じます。
bash
1sudo ufw delete allow 22/tcp
bash
1sudo ufw reload
2sudo ufw status
これで、セキュリティレベルも少しは上がります。
以上で、ユーザ作成とSSHの強化は完了です。
4.まとめ
ここまで、Ubuntu初期設定の前半が終わった感じです。
下記のように、新規の管理ユーザでSSH接続がしっかりできるようになりました。
- パッケージの更新で最新パッチを当てる
- ユーザパスワードのルール強化
- 新規の管理ユーザでデフォルトユーザ
ubuntu
利用ぜずに、サーバ運用管理を可能に - SSH接続のセキュリティを強化して安全に運用を開始
ここまでの設定は、サーバインスタンスを作成したら、早めにやった方がいい部分かなと思っています。
というのも、
/var/log/auth.log
を除いてみてください。あまりにたくさんのアタックがあるのではないしょうか? 少なくても私の環境ですと非常に多くのアタックが記述されていました。ほとんどがroot
でサーバに入ろうとしていて、Ubuntu
ではデフォルトでroot
禁止状態なので良いのですが、初心者の私からすると、無差別にサーバに入り込もうするセッションの多さにすごく驚きました。ですので、最低限の対策は先にやって、ゆっくり作業を進めていく方がよいかなと考えてこのような構成にしています。
次回は、Ubuntuの日本語かとロケール設定、ローカルスイッチへの接続設定、DBへの接続設定を進めていきます。
続きはこちら...
前回の確認はこちら...
この記事の執筆・編集担当
DE
松本 孝太郎
DELOGs編集部/中年新米プログラマー
ここ数年はReact&MUIのフロントエンドエンジニアって感じでしたが、Next.jsを学んで少しずつできることが広がりつつあります。その実践記録をできるだけ共有していければと思っています。
▼ 関連記事
[サーバ構築編#2] さくらクラウドでPostgreSQLのアプライアンスDBを作る
運用が楽々なアプライアンス「データベース」でPostgreSQL環境を作成
2025/6/20公開
![[サーバ構築編#2] さくらクラウドでPostgreSQLのアプライアンスDBを作るのイメージ](/_next/image?url=%2Farticles%2Fserver%2Fsakura-cloud-db%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#4] Ubuntu初期設定-日本語化
Ubuntu Server 24.04.1LTSの言語設定の日本語化とシステム時間の日本時間ゾーン設定
2025/6/20公開
![[サーバ構築編#4] Ubuntu初期設定-日本語化のイメージ](/_next/image?url=%2Farticles%2Fserver%2Fubuntu-locale%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#5] Ubuntu初期設定-アプライアンスDB(PostgreSQL 13)との接続設定
Webサーバのイーサネット設定を行いローカルスイッチとアプライアンスDBのPostgreSQL 13へのアクセスを可能に
2025/6/20公開
![[サーバ構築編#5] Ubuntu初期設定-アプライアンスDB(PostgreSQL 13)との接続設定のイメージ](/_next/image?url=%2Farticles%2Fserver%2Fubuntu-ethernets%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#6] UbuntuへNginx1.28.0をインストール
Ubuntu 24.04.2 LTSへNginx1.28.0をインストールします。合わせて、SetGIDやACLを利用して運用しやすいディレクトリの権限設定を実施
2025/6/20公開
![[サーバ構築編#6] UbuntuへNginx1.28.0をインストールのイメージ](/_next/image?url=%2Farticles%2Fserver%2Fnginx%2Fhero-thumbnail.jpg&w=1200&q=75)
[サーバ構築編#1] さくらクラウドでUbuntuサーバのインスタンスを作る
コントロールパネルからサクッとUbuntuサーバのインスタンスを作成
2025/6/20公開
![[サーバ構築編#1] さくらクラウドでUbuntuサーバのインスタンスを作るのイメージ](/_next/image?url=%2Farticles%2Fserver%2Fsakura-cloud-server%2Fhero-thumbnail.jpg&w=1200&q=75)