はじめに¶
手順書や公開用のブログでよくパスワードの設定を指示する場合があると思います。その時に、 "mysecret" (適宜変更してください。) とかって書くのは手順書的にいまいち格好悪いし、うっかり秘密のパスワードを公開してしまったりというリスクもあります。そんな時に役立ちそうなシェル芸を StackExchange で見つけたので、メモっておきたいと思います。
元ネタはこちら
StackExchange
How to generate a random string?
結論¶
これ
1 |
<span class="n">head</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">urandom</span> <span class="o">|</span> <span class="n">tr</span> <span class="o">-</span><span class="n">dc</span> <span class="n">A</span><span class="o">-</span><span class="n">Za</span><span class="o">-</span><span class="n">z0</span><span class="o">-</span><span class="mi">9</span> <span class="o">|</span> <span class="n">head</span> <span class="o">-</span><span class="n">c</span> <span class="mi">13</span> <span class="p">;</span> <span class="n">echo</span> <span class="s1">''</span> |
head コマンドで /dev/urandom から乱数を取得して、tr コマンドで文字列に変換して head コマンドで必要な文字数を取り出しています。
tr コマンドの "-d" オプションは削除指示で、"-c" オプションと組み合わせると、後ろで指定した文字以外を削除という意味になります。
head コマンドの "-c" オプションは、取り出す量を行数でなくて文字数で指示しています。
最後の echo コマンドは、そのまま出力すると改行が入らないで、コマンドプロンプトとつながって見難くなるのを抑止しています。
/dev/urandom を使うと刺さってしまうのでは?と心配される方もいらっしゃるかと思いますが、今は機構が変わっているのでそんなに心配しなくても大丈夫です。
使い道¶
例えば mysql や、mariadb のユーザを作成する場合を考えます。
通常手順書的には以下のように書くことが多いと思います。
1 2 |
mysql -u root -e "GRANT ALL ON MYDB.* TO 'myuser'@'localhost' IDENTIFIED BY 'mypassword';" ※ mypassword を置き換えてね |
ただこれだと単純にコピペできませんし、うっかりそのままコピペしてセキュリティが低い設定をしてしまう可能性があります。
そこで以下のように書き換えてしまいます。
1 2 3 4 |
MYPASS=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13) mysql -u root -e "GRANT ALL ON MYDB.* TO 'myuser'@'localhost' IDENTIFIED BY '${MYPASS}';" echo $MYPASS (出力を控えてね) |
これであれば、コピペですべて対応できますし、うっかり秘密のパスワードをブログに書いてしまうこともないですし、安全でないパスワードで構築してしまう可能性もずいぶん減ると思います。
応用として sed を使って設定ファイルを書き換えてしまえば、パスワードが全く人目に触れることなく、設定が完了してしまいます。
例えば、パスワードを設定する箇所が "password=MY_PASSWORD_HERE" という行があるsetting という名前の設定ファイルがあるとして、
1 2 |
<span class="n">cp</span> <span class="n">setting</span> <span class="n">setting</span><span class="o">.</span><span class="n">org</span> <span class="n">sed</span> <span class="o">-</span><span class="n">e</span> <span class="s2">"s/MY_PASSWORD_HERE/$</span><span class="si">{MYPASS}</span><span class="s2">/g"</span> <span class="o"><</span> <span class="n">setting</span><span class="o">.</span><span class="n">org</span> <span class="o">></span> <span class="n">setting</span> |
とかしてしまえば、パスワードを控える必要すらありません。
ちょっとした応用¶
今回の例では、生成されるパスワードがアルファベット大文字、小文字、数字だけで構成されてしまいます。それでは弊社のパスワード要件が満たせないよってかたは、tr コマンドに渡す文字集合を変更してみてください。
以下の例では、OWASP Password special Charactersを渡しています。
1 |
head /dev/urandom | tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' | head -c 13 ; echo |
投稿者プロフィール
最新の投稿
- AWS2021年12月2日AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
- セキュリティ2021年7月14日ゼロデイ攻撃とは
- セキュリティ2021年7月14日マルウェアとは
- WAF2021年7月13日クロスサイトスクリプティングとは?