バックドア対策の一部 - AlmaLinux10、管理専用ユーザと切り分けて、ユーザアカウントをSSHログイン(2025/12/07投稿と修正、2025/12/08変更修正)
すみません、項目の1)がものすごく長いです
また、バックドア対策の全てではありません
バックドア対策の一部です
事前知識として
◯ Linux に侵入したバックドアが最初に狙うのは /etc/shadow だそうです。
ここにはハッシュ化されたパスワードが入っています。
例:
ユーザ名:$6$...$...:19241:0:99999:7:::
攻撃者はこれを盗み、
オフラインで総当たりや辞書攻撃でハッシュを解析しようとします。
狙われるもの:
root パスワードのハッシュ
sudoユーザのパスワードのハッシュ
ログインできる全ユーザのパスワードのハッシュ
つまり sudo時に使う“ユーザのパスワード” も解析対象です。
○バックドアは最初どう動く?
一般的な流れは以下のどれかだそうです:
| 状態 | 権限 | 次のアクション |
|---|---|---|
Web脆弱性などで侵入 |
一般ユーザー |
権限昇格 → /etc/shadow参照 |
sudo設定のミス悪用 |
すぐroot |
/etc/shadowを奪う or 書き換え |
SSH鍵を盗む |
一般 or root |
同上 |
多くの場合、侵入直後は root ではなく一般ユーザー権限です。
しかし、バックドアは必ず root になるための手段を探します。
なので、SSH接続でのsudo権限コマンドをユーザアカウントは使わせず
管理専用ユーザでは、SSH接続不可でログイン(直接、管理専用アカウントでサーバに直ログインもできないようにする)
※rootアカウントのパスワードはものすごく複雑にする(意味がわからないものにしましょう)
※管理専用のユーザパスワードは、12文字〜16文字を推奨だそうです
では、設定の仕方を投稿します
内容:
sudo権限が使える管理専用ユーザ(1人分だけ、攻撃者が調べにくいようにするため)を作り、
ssh接続でユーザアカウントログイン時にsudo権限が使えず、使えるコマンドを狭める方法です
一応検証済みです。もし記述で間違えていたらよろしくお願いします
なお、今回も私自身のための技術ブログみたいな感じですので、あくまで参考までに
マシン構成
ホストマシン:MacBook Air M4
仮想システム:UTM ver 4.7.4
仮想OS: AlmaLinux10(minimal)
HDD: 20GB
メモリ:2GB
言葉の意味
targetuser ← ユーザアカウント
groupuser ← グループユーザ
adminiuser ← 管理専用アカウント
/users/chroot ← chrootを構築するベースディレクトリ
として、考えてください
このアカウントはあくまでも参考です。
すでに記事にしてますので本番環境時は
セキュリテュのためアカウントを変えてください
全体の流れ
1). chrootの準備
2). 管理専用ユーザーを作る
3). このユーザに sudo 権限を与える
4). adminiuser(管理専用ユーザ)をログインできなくする
5). グループにadminuser として任意のコマンドを付与する
6). ユーザアカウントのwheelをグループから削除
7). 最終実験
※先に管理専用ユーザの設定をすると、
あとで大変なので
先にchrootの設定をしてます
1). chrootの事前準備
1-1. chrootを作るためのベースディレクトリ作成
# mkdir -p /users/chroot
# mkdir -p /users/chroot/etc
# cd /users/chroot
# mkdir bin
# mkdir lib
# mkdir lib64
# mkdir -p /users/chroot/usr/bin
1-2. passwdとgroupのコピー
※これによって、その人のアカウントデータしか、わからないようにします
# grep ‘^targetuser:' /etc/passwd | tee /users/chroot/etc/passwd
# grep ‘^groupuser:' /etc/group | tee /users/chroot/etc/group
1-3. 必要コマンドをコピー
※ここでは、セキュリティのためtargetuserで使えるコマンドを絞ってください
# cp -p /bin/<コマンド> /users/chroot/bin/
私は
bash、ls、ps、pwd、cp、mv、cd、find、grep、tty、mkdir、rm
を入れました
# cp -p {/bin/bash,/bin/ls,/bin/ps,/bin/pwd,/bin/cp,/bin/mv,/bin/cd,/bin/find,/bin/grep,/bin/tty,/bin/mkdir,/bin/rm} /users/chroot/bin/
1-4. コピーしたコマンドの依存関係を調べてコピー
# ldd <コマンド>
出たものを
# cp -p /lib/ld-linux-aarch64.so.1 /users/chroot/lib/
※これも、あくまでもAlmaLinux10(arm64版)の場合です
# cp -p /lib64/<依存関係ファイル> /users/chroot/lib64/
依存関係の種類
bash → /lib64/libtinfo.so.6、/lib64/libc.so.6
cp → /lib64/libselinux.so.1、/lib64/libacl.so.1、/lib64/libattr.so.1、/lib64/libc.so.6、/lib64/libpcre2-8.so.0
find → /lib64/libselinux.so.1、/lib64/libc.so.6、/lib64/libpcre2-8.so.0
grep → /lib64/libpcre2-8.so.0、/lib64/libc.so.6
ls → /lib64/libselinux.so.1、/lib64/libcap.so.2、/lib64/libc.so.6、/lib64/libpcre2-8.so.0
mkdir → /lib64/libselinux.so.1、/lib64/libc.so.6、/lib64/libpcre2-8.so.0
mv → /lib64/libselinux.so.1、/lib64/libacl.so.1、/lib64/libattr.so.1、/lib64/libc.so.6、/lib64/libpcre2-8.so.0
ps → /lib64/libproc2.so.0、/lib64/libc.so.6、/lib64/libsystemd.so.0、/lib64/libcap.so.2、/lib64/libm.so.6、/lib64/libgcc_s.so.1
pwd → /lib64/libc.so.6
rm → /lib64/libc.so.6
tty → /lib64/libc.so.6
なので、
# cp -p /lib64/libtinfo.so.6 /lib64/libc.so.6 /lib64/libselinux.so.1 /lib64/libacl.so.1 /lib64/libattr.so.1 /lib64/libpcre2-8.so.0 /lib64/libcap.so.2 /lib64/libproc2.so.0 /lib64/libsystemd.so.0 /lib64/libm.so.6 /lib64/libgcc_s.so.1 /users/chroot/lib64/
※これも、あくまでもAlmaLinux10(arm64版)の場合です
1-5. vimのコピー
ホスト側でvimを事前にインストールしておいてください
# cp -p /usr/bin/vim /users/chroot/usr/bin/
# mkdir -p /users/chroot/usr/share/vim
# cp -rf /usr/share/vim/* /users/chroot/usr/share/vim/
そして、依存関係をしらべて同様にコピー
※ vimはセキュリティ上良くないという話を聞いたことがあります
なので、別のエディタを入れたほうがいいかもしれません
あくまでも参考までにお願いします
1-6 chrootのユーザディレクトリ作成
# mkdir -p /users/chroot/home
# cp -pRf /home/targetuser /users/chroot/home/
1-7. targetuserに権限を作る
2025/12/08変更修正
# chmod 700 /users/chroot/home/targetuser
# chown targetuser:groupuser /users/chroot/home/targetuser
1-8 .bashrcの編集
chrootの
/users/chroot/home/targetuserの中の
.bashrc
の最後に
export PATH=/bin:$PATH:/usr/bin:$PATH
export PS1="[\u@\h \w]\$ "
を追記する
※PS1の意味
| 記号 | 意味 |
|---|---|
\u |
ユーザー名 |
\h |
ホスト名 |
\w |
カレントディレクトリ |
\$ |
root: # / 一般ユーザ: $
|
1-9. SSHサーバの設定
ssh接続のためsshd_configを編集
# vi /etc/ssh/sshd_config
最終行に
Match User tartgetuser
ChrootDirectory /users/chroot
を追記
※ Match Userの部分で複数人するときは、スペース区切り
または
カンマ区切りでいいです
例:
Match User targetuser1 targetuser2 targetuser3
または、
Match User targetuser1,targetuser2,targetuser3
1-10. sshd再起動
# systemctl restart sshd
1-11. ここでちょっとSSHの実験
ユーザアカウントでSSHログインして
sudo 権限で何かコマンドを実行してみてください
例:$ sudo ls -a など
Sorry targetuser is not allowed to execute '/bin/ls -a' as root on ・・・
とでて、sudo コマンドが使えないとでると思います
※ targetuser アカウントでパスワードを入れないといけません
2). 管理専用ユーザーを作る
※ここからは、ホストPCでやることが必須、SSH接続での構築は失敗する
2-1. 管理専用のアカウントを作成
# adduser adminiuser
2-2. 強力なパスワードを設定(12文字〜16文字が推奨されてるそうです)
# passwd adminuser
3). このユーザに sudo 権限を与える
# usermod -aG wheel adminiuser
4). adminiuser(管理専用ユーザ)をログインできなくする
# usermod -s /usr/sbin/nologin adminiuser
※もしここからログインできるようにのするためには
usermod -s /bin/bash adminiuserとする
5). グループにadminuser として任意のコマンドを付与する
(sudo -u adminiusr <コマンド>をできるようにするため)
# visudo
を実行し、
一番下に
%groupuser ALL=(adminiuser) ALL
を追加する
※最後のALLの部分は、/bin/dnf , /bin/ls (2つ以上追加する場合は、
, <カンマ> を入れる)などで、コマンドを絞ることができる、
また%targetuserの%とは、グループのこと
セキュリティ上使うコマンドは絞ったほうがよいと思います
6). ユーザアカウントのwheelをグループから削除
(ユーザアカウントでsudoできないようにする)
# gpasswd -d targetuser wheel
ここでホントにwheelが削除されてるか調べてください
$ id targetuser
7). 最終実験
管理専用アカウントでのコマンドは、ホストに直接繋げてのユーザアカウントときのみ可能です
ユーザアカウントは、通常SSH接続してください
ホストに直にログインしたときは
例:
$ sudo -u adminiuser sudo ls -a
($sudo -u adminiusr <コマンド>)
みたいな感じで使ってください
パスワードは、ユーザアカウント、管理専用アカウントの順に入れます
ssh接続でのユーザアカウントでの
sudoコマンドは使えません
また、targetuserで、使えるコマンドも
/users/chroot/bin
にコピーしたコマンドしか使えません
なので、SSHログイン接続後
$ sudo -u adminiuser sudo ls -a
を試してみてください