GUIアプリによるユーザーパスワードの変更

GUIアプリによるユーザーパスワードの変更

Linux でユーザーとグループを管理するための GUI アプリケーションを作成していました。

新しいユーザーを作成する部分は完了しましたが、新しく作成したユーザーに新しいパスワードを与える部分で行き詰まっています。私のアプリは、必要な入力 (ユーザー名、グループのリスト、パスワード) を GUI から取得し、この情報を引数として渡すスクリプトを実行するだけです。ユーザー アカウント xyz があるとします。このアカウントのパスワードを変更するには、次のコマンドを実行するだけです。

passwd xyz

これにより、新しいパスワードが要求されます。必要な情報はすべてコマンド ラインで渡されるため、スクリプトを使用して新しいアカウントを作成できます。

useradd -m -G users -g "groups" -s /bin/bash "UserName"

Qt アプリを通じてスクリプトを実行し、ユーザーを作成できますが、 ではpasswd cmd、別の行で入力を求められます。どのように対処すればよいでしょうか?

答え1

ここでの正しい答えは次のようになると思います:コマンドラインツールにシェルを実行しないでください。ライブラリ呼び出しを使用してください。これにより、エラーをより適切に処理できるようになり、コマンド ラインでパスワードを渡すリスクを回避できます。

使用できるライブラリの1つはlibuserは比較的シンプルで、C と Python のバインディングを備えています。

答え2

root として、次の方法を使用してスクリプト経由でユーザーのパスワードを体系的に設定できます。

$ echo -n "$passwd" | passwd "$uname" --stdin

パスワードの生成

コマンドラインツールを使うのが好きですpwgenパスワードを生成します。

$ passwd="`pwgen -1cny | sed 's/[\$\!]/%/g'`"

$ pwgen --help
Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]

Options supported by pwgen:
  -c or --capitalize
    Include at least one capital letter in the password
  -A or --no-capitalize
    Don't include capital letters in the password
  -n or --numerals
    Include at least one number in the password
  -0 or --no-numerals
    Don't include numbers in the password
  -y or --symbols
    Include at least one special symbol in the password
  -s or --secure
    Generate completely random passwords
  -B or --ambiguous
    Don't include ambiguous characters in the password
  -h or --help
    Print a help message
  -H or --sha1=path/to/file[#seed]
    Use sha1 hash of given file as a (not so) random generator
  -C
    Print the generated passwords in columns
  -1
    Don't print the generated passwords in columns
  -v or --no-vowels
    Do not use any vowels so as to avoid accidental nasty words

しかし、これは安全ではないのでしょうか?

いいえ。パスワードは STDIN 経由で に渡されるので、passwd経由で誰かがプロセスを覗き見ることは可能かもしれませんがps、それでもユーザーが root のプロセスを見ることはできないはずです。パスワードを に渡すことはpasswd遮断されています。

あるターミナルで root としてこのコマンドを実行するとします。

$ ( sleep 10; echo "supersecret" | passwd "samtest" --stdin ) &
[1] 13989

次にps別のターミナルで実行します:

$ ps -AOcmd | grep pass
14046 passwd samtest --stdin      R pts/11   00:00:00 passwd samtest --stdin

1 番目の端末でパスワードが変更された後:

[root@greeneggs ~]# Changing password for user samtest.
passwd: all authentication tokens updated successfully.

passwd への echo はどうですか?

これでもパスワードは漏洩しません。これを証明する別のテストを次に示します。まず、セカンダリ ターミナルでこのコマンドを開始します。これにより、からの出力が収集されますps

$ while [ 1 ]; do ps -eaf2>&1 | grep -E "echo|pass";done | tee ps.txt

次に、パスワード設定コマンドを実行します。

$ echo "supersecret" | passwd "samtest" --stdin &
[1] 20055
$ Changing password for user samtest.
passwd: all authentication tokens updated successfully.

[1]+  Done                    echo "supersecret" | passwd "samtest" --stdin

内容を確認するとps.txt、パスワードが漏洩していないことがわかります。

$ grep supersecret ps.txt
$

ps使用するコマンドを変更してps -eafも、漏洩は発生しません。

答え3

passwd --help私のボックスでは、stdin に新しいパスワードを入力してroot実行できることを示しています。--stdin

答え4

chpasswdコマンドは、コマンドラインからユーザー名とパスワードのペアのリストを読み取り、既存のユーザーのグループを更新します。各行は次の形式です。

user_name:password

このコマンドは、一度に多数のアカウントが作成される大規模なシステム環境での使用を目的としています。このコマンドのその他のオプションについては、以下を入力してください。

man chpasswd

関連情報