Linux ではユーザを切替えながら処理を実行したり、ネットワークを越えて命令を実行することができる。外部から攻撃を受けてバックドアが仕掛けられていて不正侵入をうけているのか確認する時に、どういったユーザの処理を実行しているのか把握し、リモート接続で処理ができるような状態なのか知ることが重要。
ユーザとユーザの切り替え
ユーザ,グループの管理
unix では、ユーザ情報は /etc/passwd , /etc/group で管理している。passwdファイル先頭の、ユーザ番号 0 は、なんでもできる権限を持つシステム管理者 root となっている。ユーザ番号 1~999 は、システムを動かすための特殊なユーザとなっている。1000以上は、実際のユーザに割り当てることが多い。
((( /etc/passwd ))) root:x:0:0:root:/root:/bin/bash sshd:x:111:65534::/var/run/sshd:/usr/sbin/nologin tsaitoh:x:1000:1000:Tohru Saitoh,,,:/home/tsaitoh:/bin/zsh | tsaitoh = ユーザ名 | x = 昔はパスワードが書いてあった, *ならアカウントロック | 1000 = ユーザ番号 | 1000 = グループ番号 | Tohru Saitoh,,, = ユーザの名前など | /home/tsaitoh = ホームディレクトリ | /bin/zsh = シェル ((( /etc/group ))) root:x:0: ssh:x:112: home:x:1000:tsaitoh | home = グループ名 | x = 昔はパスワードが書いてあった, *ならアカウントロック | 1000 = グループ番号 | tsaitoh = グループに所属するユーザ名(コンマ区切り)
ただし、/etc/passwd, /etc/group は、全ユーザが読めるファイルで、暗号化されたパスワードを覚えるには不向きなので、/etc/shadow , /etc/gshadow に保存されている。
ユーザの確認
自分の情報を確認するには、whoami , id , finger コマンドを用いる。
$ whoami # ユーザ名を表示 tsaitoh $ id # UIDやGIDなどの情報を表示 uid=1000(tsaitoh) gid=1000(home) .... $ finger # ユーザの詳しい情報を表示 Login Name Tty Idle Login Time Office Office Phone tsaitoh Tohru Saitoh pts/0 Feb 17 22:47 (192.168.11.xx) 12-3456
su コマンド
ユーザを切り替えるには、su コマンドを用いる(Set User)。別ユーザで命令を実行することもできる。ただし、その別ユーザのパスワードが必要。
$ su root Password: ●●●●●●●● # exit $ su -c whoami root Password: ●●●●●●●● root
システム管理者での作業は、危険な命令も実行できる状態なので、作業ミスを減らすためにプロンプトが、# に切り替わる。
ただし、su コマンドは、切り替えるユーザのパスワードが必要である。システム管理作業を複数人で行う場合、管理者パスワードを複数人に教えることになり、セキュリティ的に危険である。
sudo コマンド
そこで、管理者などに登録した人であれば、自分のパスワードで管理者権限を得ることができる sudo (set user do) コマンドを使うのが一般的である。
$ sudo bash Password: ●●●●●●●● 自分のパスワード # exit $ sudo whoami # 管理者で whoami を実行 root $ sudo -u foobar # ユーザ foobar に変更 $ whoami foobar $ exit $ whoami tsaitoh
システム管理者になれるユーザの設定は、/etc/sudoers に記載されている。一般的に、sudo グループに所属していれば、管理者になれるように設定されていることが多い。
su id bit / スティッキービット
パスワードを変更するpasswdコマンドでは自分のパスワードを変更でき、/etc/passwd や /etc/shadow が書き換えられる。unixのr,w,xの権限だけの知識だと、通常ユーザ自身がpasswd,shadowファイルを書き換えられるのなら、同じファイルに記録されている他のユーザ情報(特にパスワードを変更できるはずである。であれば、他人のパスワードも変更できてしまうのではないのか? 当然、こんなことはできてはいけない。
実は、一時的に他のユーザ権限を借りて作業をするため(システム管理者の権限を借りて作業するため)に、su id bit (スティッキービット)という属性がある。
$ sudo bash $ passwd Password: ●●●●●●● Re enter Password: ●●●●●●● $ which passwd /usr/bin/passwd ls -al /bin/ls -rwxr-xr-x 1 root root 138856 8月 7 2019 /bin/ls $ ls -al /bin/passwd -rwsr-xr-x 1 root root 63960 2月 7 23:54 /usr/bin/passwd
上記の passwd コマンドでは、ファイル属性が – rws r-x r-x となっている。(通常の ls コマンドでは、– rwx r-x r-x となっている。)
su id bit が ON になっているコマンドは、一時的に そのファイル所有者 (/usr/bin/passwd の所有者は root) の権限を借りて命令を実行できる。
ただし、スティッキービットが ON だと、管理者権限で命令を実行することができるが、そのコマンドに不備(脆弱性)があると、システムを乗っ取るためにクラッカーが悪用する場合がある。
((( suid ビットが ON のファイルを探す ))) $ find /usr/bin -perl /u=s -print /usr/bin/password
リモート作業
ネットワークを越えて命令を実行するには、telnet や rsh や ssh コマンドを使う。telnet や rsh コマンドは、通信内容が暗号化されていないため、パケットキャプチャを使われると、パスワードなどを盗むこともできるため、通常は使ってはならない。
telnet (暗号化なしのリモート接続)
$ telnet remote-host # remote-host という名前のコンピュータに telnet で接続 login: ユーザ名 password: パスワード $ exit
ssh (暗号化されたリモート接続)
ssh は、通信内容を暗号化して安全にリモートコンピュータで命令を実行するコマンド。リモートコンピュータへの接続(slogin)、リモートコンピュータで命令の実行(ssh)、リモートコンピュータとのファイル転送(scp) などができる。
$ slogin remote-host # 別コンピュータにlogin Password: ●●●●●●●● $ hostname # 使っているコンピュータ名を調べるコマンド remote-host $ exit $ slogin foobar@remote-host # 指定したユーザ名(foobar)で接続 Password: foobarのパスワード $ whoami foobar $ exit $ ssh remote-host ls # remote-host 上で ls を実行 Maildir $ ssh foobar@remote-host whoami foobar $ scp test.c remote-host:~ # ファイル test.c を remote-host のホームディレクトリにコピー(アップロード) $ scp foobar@remote-host:hoge.txt dest-dir # リモートホストの hoge.txt を、dest-dir にコピー(ダウンロード)