こんにちはますのです。
EC2を構築していてcloud-initが勝手にサービス起動して困ること、ありますよね。
今回はsystemctl disableをしていてもサービスが勝手に起動してしまう時に対応したことをメモしていきます。
お試しの際は影響のないサービスや環境で実施、ならびに発生した影響に関しては自己責任でお願いいたします。
結論:systemctl maskを利用する
今回実施したことは下記コマンドによるサービス起動の停止となります。
$ sudo systemctl mask sshd
前提
以下の環境を前提として今回の対応に踏み切りました。
- OSはAmazonLinux2で検証
- sshdをEC2再起動時に自動起動しないようにしたい
- cloud-initはアンインストールしない
- Sesion Managerでのssh接続は不可
- セキュリティグループのsshポート(22)はアタッチしたままとする
- 以下のコマンドは実施済である
- systemctl stop sshd
- systemctl disable sshd
発生していた事象
今回「systemctl mask」に至るまでの経緯について記載します。
- EC2を再起動、停止→起動どちらを実施してもsshd.serviceが立ち上がってしまう
- cloud-initのconf:cloud-configの設定を触っても解決出来ず
- cloud-initをアンインストールした場合はdisable状態のsshd起動はされなかいことを確認
つまりcloud-initが原因であることは確定と考えます。
しかしcloud-initのconfigファイルの理解が足りないこともあり、config編集では解決には至りませんでした。
設定方法
結論でも書いた通り、下記コマンドを実行した完了です。
$ sudo systemctl mask sshd
なお、maskを解除する場合は下記コマンドとなります。
$ sudo systemctl unmask sshd
systemctl maskとは
manコマンドで確認した説明によると、自動起動もしないけど手動起動(systemctl start)でも起動しなくなるから注意と記載されています。
$ man systemctl
~~~~(略)~~~~
mask NAME...
Mask one or more unit files, as specified on the command line. This will link these units to /dev/null, making it impossible to start them. This is a stronger
version of disable, since it prohibits all kinds of activation of the unit, including enablement and manual activation. Use this option with care. This honors the
--runtime option to only mask temporarily until the next reboot of the system. The --now option can be used to ensure that the units are also stopped.
unmask NAME...
Unmask one or more unit files, as specified on the command line. This will undo the effect of mask.
/etc/systemd/system/(name).service ファイルを、/dev/null へのシンボリックリンクに置き換え、実際のユニットファイルが systemd ファイルにアクセスできないようにします。
ChatGPT先生にも簡単に翻訳してもらいおおよその確認。
オプション「–runtime」を試してみる
runtimeを試したところ、こちらはmaskされていてもシステム再起動時には起動する状態となるようです。
[root@ip-172-31-8-4 ~]# systemctl mask sshd --runtime
Created symlink from /run/systemd/system/sshd.service to /dev/null.
[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead) since Wed 2023-05-10 17:27:53 UTC; 10s ago
Main PID: 3092 (code=exited, status=0/SUCCESS)
[root@ip-172-31-8-4 ~]# shutdown -r now
~~~[再起動後]~~~
[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2023-05-10 17:29:23 UTC; 1min 19s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 3096 (sshd)
CGroup: /system.slice/sshd.service
└─3096 /usr/sbin/sshd -D
May 10 17:29:23 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Starting OpenSSH server daemon...
May 10 17:29:23 ip-172-31-8-4.ap-northeast-1.compute.internal sshd[3096]: Server listening on 0.0.0.0 port 22.
May 10 17:29:23 ip-172-31-8-4.ap-northeast-1.compute.internal sshd[3096]: Server listening on :: port 22.
May 10 17:29:23 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Started OpenSSH server daemon.
オプション「–now」を試してみる
「–now」オプションで試してみます。
ついでにオプション有無での違いをchatGPTさんへ確認。
検証結果から正しいことが分かりました。
サービスが起動している状態で実行しても、–nowオプションをつけていればマスク設定と共にサービス停止状態に変化します。
また、OS再起動後にsshdが起動しないことを確認できました。
[root@ip-172-31-8-4 ~]# systemctl mask sshd --now
Created symlink from /etc/systemd/system/sshd.service to /dev/null.
[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead) since Wed 2023-05-10 17:34:34 UTC; 7s ago
Main PID: 3096 (code=exited, status=0/SUCCESS)
[root@ip-172-31-8-4 ~]# shutdown -r now
~~~[再起動後]~~~
[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)
May 10 17:36:35 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Cannot add dependency job for unit sshd.service, ignoring: Unit is masked.
Warning: sshd.service changed on disk. Run 'systemctl daemon-reload' to reload units.
systemctl stop sshdを忘れていたとしても、–nowがついていれば停止状態まで持っていけるということですね。
オプション無しで試してみる
「systemctl stop」を事前にしていた場合は–nowオプションを付けた場合と同じ動きになります。
下記の通りActive状態でmaskを設定した場合、OS再起動時にユニット停止となります。
[root@ip-172-31-8-4 ~]# systemctl mask sshd
Created symlink from /etc/systemd/system/sshd.service to /dev/null.
## maskは設定されたが起動状態である
[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
Loaded: masked (/dev/null; bad)
Active: active (running) since Wed 2023-05-10 17:51:04 UTC; 24s ago
Main PID: 3358 (sshd)
CGroup: /system.slice/sshd.service
└─3358 /usr/sbin/sshd -D
May 10 17:51:03 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Starting OpenSSH server daemon...
May 10 17:51:04 ip-172-31-8-4.ap-northeast-1.compute.internal sshd[3358]: Server listening on 0.0.0.0 port 22.
May 10 17:51:04 ip-172-31-8-4.ap-northeast-1.compute.internal sshd[3358]: Server listening on :: port 22.
May 10 17:51:04 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Started OpenSSH server daemon.
May 10 17:51:18 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Current command vanished from the unit file, execution of the command list won't be resumed.
## list-unitでもmaskedとなっていることを確認
[root@ip-172-31-8-4 ~]# systemctl list-units --all | sshd
sshd re-exec requires execution with an absolute path
[root@ip-172-31-8-4 ~]# systemctl list-units --all | grep ssh
sshd-keygen.service loaded inactive dead OpenSSH Server Key Generation
● sshd.service masked active running sshd.service
sshd.socket
[root@ip-172-31-8-4 ~]# shutdown -r now
~~~[再起動後]~~~
[root@ip-172-31-8-4 ~]# systemctl status sshd
● sshd.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)
May 10 17:57:01 ip-172-31-8-4.ap-northeast-1.compute.internal systemd[1]: Cannot add dependency job for unit sshd.service, ignoring: Unit is masked.
Warning: sshd.service changed on disk. Run 'systemctl daemon-reload' to reload units.
おまけ:EC2インスタンスの復元方法
筆者はsshdを起動させる方法として下記を想定しています。
- 対象のEC2インスタンスのAMIを取得
- AMIから新たにEC2インスタンスを作成
- EC2インスタンス作成時の設定で、ユーザデータに「systemctl unmask」を行うシェルを設定
ユーザーデータ設定方法
実際のAMI復元時のユーザーデータとなります。
#!/bin/bash
systemctl unmask sshd
systemctl enable sshd
systemctl start sshd
設定箇所:
EC2インスタンス作成画面 > 高度な詳細 > ユーザーデータに貼り付け > インスタンスを起動 より起動。
他手段としては、EBSボリュームを別インスタンスにアタッチするなども考えられます。
※ただし構築時の設計次第なのでAMIが手っ取り早い気持ちです。