えくせるちゅんちゅん

ことりがエクセルをちゅんちゅんするブログ

QNAPにSSHで接続してユーザーを管理する

本記事はQNAPにSSHで接続してユーザー管理をするために、私が試行錯誤したときの記録です。

不明なところがたくさんあるので、もしよろしければアドバイスを頂けると幸いです。

きっかけ

今までQNAPのユーザー登録は、管理コンソールのGUIの「ユーザーのインポート/エクスポート」からcsvを投入して対応していた。

ところが、この方法では

  • ユーザーが削除出来ない
  • ユーザーをグループから除外できない

という問題があるため、これらの操作は手動での対応となり、正直に言うとちゃんと削除しているか怪しい。


今後もユーザーの部署移動や増減は発生するし、どんどん悪化して行く恐れがあるので解消しておきたい。

QNAPはTelnetSSHで接続して、コマンドで操作することができるらしいので試してみることにした。


なお、私がSSHを使用するのはこれが初めてなルーキーなので、本書の内容が必ずしも適切とは限らないことに留意すること。


SSHの導入

Windows10 Spring Creators Update(1803)以降はOpenSSHクライアントの機能がデフォルトで導入状態されており、何も考えなくてもsshコマンドが使える。


Windows10 Fall Creators Update(1709)では、以下の手順を踏めばSSHクライアントが利用できるようになった。

  1. Windowsロゴキーを押す
  2. Optionと入力
  3. オプション機能を追加するを起動
  4. 「機能の追加」から「OpenSSH Client(Beta)」をインストール
  5. PCを再起動


更に古いWindows PCの場合は、自力でSSHをするソフトを入手してインストールする必要があるが、私には必要なかったので試していない。

インストール方法はググればいくらでもでてくるので省略する。


なお、QNAPのコマンドはbusyboxが提供しているらしい?(よく分かってない)


SSHでログイン

※実際のサーバーのIP/ユーザー名とは異なります。

とりあえずPowerShellを起動してsshと入力したら解説が出てきた。

PS C:\Users\*****> ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]

これを参考に、それっぽいのを打ち込んでみた。


失敗例

ssh -b 192.168.1.123 -D 22 -l admin 

色々やってたら、こんなエラーが出た。(英文+Google翻訳

The authenticity of host '192.168.1.123 (192.168.1.123)' can't be established.
RSA key fingerprint is SHA256:cX+YK1g4mOvWauaiisXJlERwzdyUOExHJbZA1OnfVJA.
Are you sure you want to continue connecting (yes/no)?
ホスト '192.168.1.123(192.168.1.123)'の信頼性は確立できません。
RSAキーのフィンガープリントはSHA256です:cX + YK1g4mOvWauaiisXJlERwzdyUOExHJbZA1OnfVJA。
接続し続けますか?(はい/いいえ)?

Warning: Permanently added '192.168.1.123' (RSA) to the list of known hosts.
警告:既知のホストのリストに '192.168.1.123'(RSA)を恒久的に追加しました。

Bad local forwarding specification '192.168.1.123'
不正なローカル転送指定 '192.168.1.123'

これは私の手に負えそうにない。

というわけで、SSH ログインでググって出てきた例を色々試すことにした。


成功例

入力フォーマット

ssh ユーザー名@サーバーのIPアドレス
パスワード

入力例

ssh admin@192.168.1.123
hogehoge


コマンド一覧

まず、どこから手を付けたら良いのやら。

コマンドリファレンスみたいなものが公開されているのでは?

と思ったが、上手く見つけられない。

listとかhelp的なコマンドで一覧が出てくるのでは?

と思ったが、そんな都合よくは出てこない。

Linuxコマンドに広げて、コマンド一覧の取得方法を調べてみたが、QNAPで動くサンプルが見つけられなかった。

そん中、ふとQNAP コマンド一覧で検索していたら以下のサイトにコマンドのリストを発見した。

http://qnap.web.fc2.com/04/0017.html

この中からuserとかgroupとか、それっぽい名前を探して適当に使ってみる。


豆知識

  • コマンド名だけを打ち込むと解説文が出てくる
  • clsと入力するとコマンドのログがリセットされる

あたりまえって言わないで!


ユーザーを追加

コマンド

ユーザーの追加はadduserを使うらしい。

[~] # adduser
BusyBox v1.24.1 (2018-12-28 02:18:55 CST) multi-call binary.

Usage: adduser [OPTIONS] USER [GROUP]

Create new user, or add USER to GROUP

        -h DIR          Home directory
        -g GECOS        GECOS field
        -s SHELL        Login shell
        -G GRP          Add user to existing group
        -S              Create a system user
        -D              Don't assign a password
        -H              Don't create home directory
        -u UID          User id
        -k SKEL         Skeleton directory (/etc/skel)

QNAP Options:
        -p PASSWD       Change user passwor

成功例

ただの追加ならこれで出来た。

入力文

adduser aaa
aaa
aaa

実際の画面

[~] # adduser aaa
Changing password for aaa
New password:
Retype password:
Password for aaa changed by admin

実際にユーザーが作成された。

さらに、自動的にユーザー名と同じ名前のグループが作成され、グループに追加されていた。


失敗例

すでにユーザーが存在する時はこんな文章

[~] # adduser bbb
adduser: user 'bbb' in use


説明欄に書き込む

QNAPのユーザー管理画面には「説明」欄がある。

他のOSでもあるように、好きな言葉を書ける欄だ。

「説明」欄はコマンドに-g 文章を追記すれば良いことがわかった。

上記の通り-gの解説はGECOS GECOS fieldとなっているが、見かけない言葉なので調べてみた。

https://uc2.h2np.net/index.php/GECOS%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89

というわけでGECOS情報とは、コメントフィールドのことらしい。


グループを指定

グループの指定をしない場合、自動的にユーザー名と同じグループが作成され登録状態となるが、-Gで明示的に指定することができるらしい。

なお一部のLinuxでは-Nで自動作成を拒否できるようだが、QNAPは対応していなかった。

それなのに、明示的にグループを指定する場合は、先にグループを用意しておかないとエラーが出てしまった。

[~] # adduser eee -G GroupEEE
adduser: unknown group GroupEEE

でも、よく見ると-Gの解説にはっきりと書いてあった。

Add user to existing group

なんともチグハグな仕様である。


また、後述するが複数のグループに同時に追加するような事はできなかった。


ユーザーを削除

ユーザーの削除はdeluserを使用するらしい。

成功例

can't findなので、失敗したのかと思いきや正常に削除されたときのメッセージらしい。

[~] # deluser aaa
deluser: can't find aaa in /etc/config/group

失敗例

ユーザーが存在しない時、以下のようになる。

[~] # deluser aaa
deluser: unknown user aaa

また、自動作成されたユーザー名と同一のグループは、ユーザー削除とともに削除された。


グループを追加

グループを作成するにはaddgroupを使う。

Usage: addgroup [-g GID] [-S] [USER] GROUP

Add a group or add a user to a group

        -g GID  Group id
        -S      Create a system group

成功例

単純に実行すると以下のようになる。

成功したとも。失敗したとも言わない。ナニコレ

[~] # addgroup GroupAAA
[~] #

作成されたグループは、完全に空っぽの状態。いずれのユーザーも追加されていない。

失敗例

すでに存在するものを作ろうとすると、以下のようにエラーが出た。

[~] # addgroup GroupAAA
addgroup: group 'GroupAAA' in use

グループを削除

削除する時はdelgroupを使う。

成功例

こちらも成功したら何も返事はない。

[~] # delgroup GroupAAA
[~] #

失敗例

グループが無い時は叱られる。

[~] # delgroup GroupAAA
delgroup: unknown group GroupAAA

グループ内にユーザーが存在する時、以下のようになる。

[~] # delgroup ccc
delgroup: 'ccc' still has 'ccc' as their primary group!
(delgroup: 'ccc'はプライマリグループとして 'ccc'を持っています。)

どうにかしてグループを空っぽにする必要があるようだ。


ユーザーをグループに追加

作成済みのユーザーをグループに追加するには、適したコマンドが見つからない。

CSVからのインポートの場合は、単純に同じユーザーとグループの組み合わせを複数行にして送ればよかったのだが、adduserコマンドは同じユーザーに二度使うとエラーとなるため追加できなかった。

[~] # adduser bbb -G GroupBBB
adduser: user 'bbb' in use


adduserでグループを複数指定出来ないかと思ったが、最初の1つ目しか認識されなかった。

[~] # adduser aaa -G Group1 Group2

-Gを繰り返せばよいのかと思ったのだが、今後は最後の1つしか認識されなかった。

[~] # adduser bbb -G Group1 -G Group2


別のサイトを参考にコマンドをあたっていたらusermodが使える事が判明した。

[~] # usermod
Usage: usermod [options] LOGIN

Options:
  -c, --comment COMMENT         new value of the GECOS field
  -d, --home HOME_DIR           new home directory for the user account
  -e, --expiredate EXPIRE_DATE  set account expiration date to EXPIRE_DATE
  -f, --inactive INACTIVE       set password inactive after expiration
                                to INACTIVE
  -g, --gid GROUP               force use GROUP as new primary group
  -G, --groups GROUPS           new list of supplementary GROUPS
  -a, --append                  append the user to the supplemental GROUPS
                                mentioned by the -G option without removing
                                him/her from other groups
  -h, --help                    display this help message and exit
  -l, --login NEW_LOGIN         new value of the login name
  -L, --lock                    lock the user account
  -m, --move-home               move contents of the home directory to the
                                new location (use only with -d)
  -o, --non-unique              allow using duplicate (non-unique) UID
  -p, --password PASSWORD       use encrypted password for the new password
  -s, --shell SHELL             new login shell for the user account
  -u, --uid UID                 new UID for the user account
  -U, --unlock                  unlock the user account

https://eng-entrance.com/linux-command-groupmod

しかし、使い方がわからん。。。

usermod -u aaa -G GroupAAA

とか、それっぽいのを作ってみたが、

GroupAAAは存在ません。

というエラーで進まなかった。


ユーザーをグループから除外

一度登録したユーザーをグループから除外するには、適したコマンドが見つからない。

調べているとgroupmodmodgroupの事例が見つかったが、QNAPはどちらも使えなかった。

もしかしたらusermodで出来るのかもしれないが、やはり使い方がわからない。


エイリアスの表示

参考までにaliasコマンドでエイリアスを一覧表示できた。

[~] # alias
af='ps af'
bc='calc -Cd '
calc='calc -Cd '
cls='clear'
df='df -h'
indent='indent -bad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -npsl -nsc -nsob -nss -ts4 '
ll='/bin/ls -laFh'
ls='/bin/ls -F'
minicom='minicom -c on'
ps1='ps faxo "%U %t %p %a" '
ps2='ps facux '
smb21enable='/etc/init.d/smb2_protocol.sh enable 21'
smb2disable='/etc/init.d/smb2_protocol.sh disable'
smb2enable='/etc/init.d/smb2_protocol.sh enable'
smb2status='/etc/init.d/smb2_protocol.sh status'
smb3enable='/etc/init.d/smb2_protocol.sh enable 3'
usb_qa_status='/etc/init.d/smb2_protocol.sh usb_qa_status'


組み込みコマンドの表示

helpコマンドで組み込みコマンドを一覧表示できた。

[~] # help
GNU bash, version 3.2.57(1)-release (x86_64-QNAP-linux-gnu)
These shell commands are defined internally.  Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.

A star (*) next to a name means that the command is disabled.

 JOB_SPEC [&]                       (( expression ))
 . filename [arguments]             :
 [ arg... ]                         [[ expression ]]
 alias [-p] [name[=value] ... ]     bg [job_spec ...]
 bind [-lpvsPVS] [-m keymap] [-f fi break [n]
 builtin [shell-builtin [arg ...]]  caller [EXPR]
 case WORD in [PATTERN [| PATTERN]. cd [-L|-P] [dir]
 command [-pVv] command [arg ...]   compgen [-abcdefgjksuv] [-o option
 complete [-abcdefgjksuv] [-pr] [-o continue [n]
 declare [-afFirtx] [-p] [name[=val dirs [-clpv] [+N] [-N]
 disown [-h] [-ar] [jobspec ...]    echo [-neE] [arg ...]
 enable [-pnds] [-a] [-f filename]  eval [arg ...]
 exec [-cl] [-a name] file [redirec exit [n]
 export [-nf] [name[=value] ...] or false
 fc [-e ename] [-nlr] [first] [last fg [job_spec]
 for NAME [in WORDS ... ;] do COMMA for (( exp1; exp2; exp3 )); do COM
 function NAME { COMMANDS ; } or NA getopts optstring name [arg]
 hash [-lr] [-p pathname] [-dt] [na help [-s] [pattern ...]
 history [-c] [-d offset] [n] or hi if COMMANDS; then COMMANDS; [ elif
 jobs [-lnprs] [jobspec ...] or job kill [-s sigspec | -n signum | -si
 let arg [arg ...]                  local name[=value] ...
 logout                             popd [+N | -N] [-n]
 printf [-v var] format [arguments] pushd [dir | +N | -N] [-n]
 pwd [-LP]                          read [-ers] [-u fd] [-t timeout] [
 readonly [-af] [name[=value] ...]  return [n]
 select NAME [in WORDS ... ;] do CO set [--abefhkmnptuvxBCHP] [-o opti
 shift [n]                          shopt [-pqsu] [-o long-option] opt
 source filename [arguments]        suspend [-f]
 test [expr]                        time [-p] PIPELINE
 times                              trap [-lp] [arg signal_spec ...]
 true                               type [-afptP] name [name ...]
 typeset [-afFirtx] [-p] name[=valu ulimit [-SHacdfilmnpqstuvx] [limit
 umask [-p] [-S] [mode]             unalias [-a] name [name ...]
 unset [-f] [-v] [name ...]         until COMMANDS; do COMMANDS; done
 variables - Some variable names an wait [n]
 while COMMANDS; do COMMANDS; done  { COMMANDS ; }


まとめ

ユーザーが削除出来ない

については、コマンドで削除できるようになった。


ユーザーをグループから除外できない

については、グループの増減が自在にできないので難しそうだ。

とりあえずは、変更だけならユーザーを削除して登録し直せば良い。

しかし、新たな問題が発生した。

ユーザーを複数のグループに所属させることができない

不用意にユーザーを、削除して追加するようなプログラムにしたら、手動で登録したグルーピングが消えてしまう。

QNAPのお勉強はまだまだ続きそうです。


以上


何か御座いましたらコメント欄、またはTwitterからどうぞ♪

それではまた来週♪ ちゅんちゅん(・8・)