
|
[バックナンバーのトップへ] [Linux システム管理のトップへ] いますぐ実践! Linux システム管理 / Vol.137 / 読者数:1339名こんばんは、うすだです。 本は、図書館で借りるよりも買ったほうがよい、という意見を、 メルマガやブログなどで、よく拝見します。
図書館で借りると、お金がかからなくて経済的です。
基本的には、わたしは、上記の意見に異論はありません。
というのも、自分で購入した本は、いつでも読めると思ってしまうため、
いつまでたっても読み始めないか、途中で挫折してしまうのです。 逆に、図書館で借りると、返却期限がありますので、それまでに読まないといけない、 という後向きなモチベーション(?)により、買うよりも真剣に読むことができます。
という過去の前例を考慮して、先日、以下の本を借りてきました。
セキュリティウォリア - 敵を知り己を知れば百戦危うからず この調子でうまくいくのであれば、持っている本も、 図書館で借りてきてしまえばよいのではないか、ということになりそうですね。 …間違っていることを薄々感じつつ、今回も、はりきってまいりますよ! 今回のお題 - ユーザ情報を管理する前回、mkpasswd コマンドを使って、パスワードを自動的に生成しつつ、 たくさんのユーザを一括登録するなどの方法を、ご紹介しました。
Vol.136 - パスワードを自動生成する
このあたりのネタは、大昔にもご紹介していますので、今回は潔く、
別の内容にしようかなと、最初は思いました。 というわけで今回は、以下の内容を、お送りしようと思っております。
上記になにも感じなかった貴兄は、宿題の答えへとお進みください…。 ユーザアカウントの情報を確認したいとき、 究極的には /etc/passwd と /etc/shadow ファイルを眺めればよいですが、 いかんせんパッと見て理解しにくい、という問題があります。 そんなときは、双方の内容をあわせて CSV ファイルにして、 某社表計算ソフトなどで眺めれば、わかりやすいのではないでしょうか。 思い立ったが吉日、そんな Perl スクリプトを作成してみました。
#!/usr/bin/perl
use strict;
my %passwd = &read_file("/etc/passwd");
my %shadow = &read_file("/etc/shadow");
foreach (sort keys %passwd) {
my $p = $passwd{$_};
my $s = $shadow{$_};
if(!$ARGV[0] || length($$s[0]) > 4) {
printf("%s,%s,%d,%d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n",
$_, $$s[0], $$p[1], $$p[2], $$p[3], $$p[4],
$$p[5], $$s[1], $$s[2], $$s[3], $$s[4],
$$s[5], $$s[6], $$s[7]);
}
}
sub read_file {
my ($fname) = @_;
my %ret;
open(FILE, $fname) || die "cannot open $fname";
while(<FILE>) {
chomp;
my @array = split(/:/);
my $user = shift(@array);
$ret{$user} = \@array;
}
close FILE;
%ret;
}
/etc/passwd と /etc/shadow ファイルの中身を、
read_file という名のサブルーチンで読み込み、
それぞれ連想配列 %passwd と %shadow に情報を格納します。 read_file サブルーチンは、ユーザ名をキーとして、 ユーザ名以外の情報の配列を値とした連想配列を返します。 たとえば、上記スクリプトを、showuser.pl というファイル名で保存し、 実行しますと、以下のようになります。 # chmod +x showuser.pl # ./showuser.pl adm,*,3,4,adm,/var/adm,/sbin/nologin,13257,0,99999,7,,, apache,!!,48,48,Apache,/home/httpd,/bin/false,13257,0,99999,7,,, avahi,!!,70,70,Avahi daemon,/,/sbin/nologin,13476,,,,,, bin,*,1,1,bin,/bin,/sbin/nologin,13257,0,99999,7,,, ...後略...
ただ、全部のユーザの情報を出力しますと、bin や ftp など、
特に確認する必要のないユーザも、わんさか得られてしまいます。 # ./showuser.pl hoge root,$1$秘密,0,0,root,/root,/bin/bash,13257,0,99999,7,,, test,$1$教えない,10001,100,,/home/test,/bin/bash,13996,0,99999,7,,, usu,$1$明かさない,628,4,,/home/usu,/bin/bash,13671,0,99999,7,,, ...後略... ちなみに、出力される CSV ファイルの内容は、以下の通りです。 - ユーザ名 + 暗号化されたパスワード - ユーザID - グループID - ユーザ情報(GECOS) - ホームディレクトリ - シェル + 最後にパスワードが変更された日(1970年1月1日からの日数) + パスワードが変更可能となるまでの日数 + パスワードを変更しなくてはならなくなるまでの日数 + パスワードの有効期限が来る前に、警告を発する日数 + パスワードの有効期限が過ぎてから使用不能になるまでの日数 + アカウントが使用不能になるまでの日数(1970年1月1日からの日数) + 予約フィールド
先頭が + の項目は、/etc/shadow の情報です。
Vol.098 - パスワード変更していない日数をチェックする で、リダイレクトしてファイルに保存したら、 表計算ソフトなどで開いてお好きなように処理してください。 # ./showuser.pl hoge > user_20080518.csv ただし、暗号化されているとはいえ、パスワードの情報を含みますので、 取扱いには十分ご注意ください。 さて、前回、mkpasswd コマンドを用いてユーザを作成しましたが、 生成したパスワードをお知らせしないと、使っていただくことができません。 もし、作成したユーザと同じユーザ名で、メールを受け取れる環境があるのでしたら、 そこへメールを送ればよいですよね。 そんな素敵なシチュエーションがあるだろうという前提で、 スクリプトを作成してみました。
#!/usr/bin/perl
use strict;
my $CONVERT = "/usr/bin/iconv -f EUC-JP -t ISO-2022-JP ";
my $SENDMAIL = "/usr/sbin/sendmail -oi ";
my $MAIL_FROM = "postmaster\@new.usupi.org";
my $TO_DOMAIN = "old.usupi.org";
while(<>) {
chomp;
my @array = split(/,/);
if(open(MAIL, "|$CONVERT|$SENDMAIL $array[0]\@$TO_DOMAIN")) {
print MAIL "From: $MAIL_FROM\nTo: $array[0]\@$TO_DOMAIN\n";
print MAIL "Subject: $array[0] created\n";
print MAIL "Mime-Version: 1.0\n";
print MAIL "Content-type: text/plain;charset=iso-2022-jp\n\n";
if($array[4]) {
print MAIL "$array[4] さんへ\n\n";
} else {
print MAIL "$array[0] さんへ\n\n";
}
print MAIL "あなたのパスワードは $array[1] です。\n";
print MAIL "すぐパスワードを変更してくださいねー。\n";
close MAIL;
} else {
print STDERR "cannot send mail.\n";
}
}
$MAIL_FROM にメールの送信元アドレスを、
$TO_DOMAIN に送信先アドレスのドメインの部分を指定してください。 # cat user001-100.csv user001,5ia4fAQk,501,500,User 001,/home/user001,/bin/bash user002,qi8clZC5,502,500,User 002,/home/user002,/bin/bash ...中略... user100,0Vkyu1Ow,600,500,User 100,/home/user100,/bin/bash
最初のユーザ名を送信先アドレスに使用して、
2つ目の生のパスワードをメールでお知らせします。 # chmod +x sendpasswd.pl # ./sendpasswd.pl user001-100.csv ちなみに、以下のようなメールが届きます。 From: postmaster@new.usupi.org To: user001@old.usupi.org Subject: user001 created User 001 さんへ あなたのパスワードは Xdjg04uU です。 すぐパスワードを変更してくださいねー。
…とはいえ、そんな都合のいいシチュエーションがあるとは限りません。
それでは、テキストファイルを作成し、印刷して、みなさんにひっそりと配る、
というのではいかがでしょうか。
#!/usr/bin/perl
use strict;
my $CONVERT = "/usr/bin/iconv -f EUC-JP -t UTF-16 ";
while(<>) {
chomp;
my @array = split(/,/);
if(open(TXT, "|$CONVERT > $array[0].txt")) {
if($array[4]) {
print TXT "$array[4] 殿\r\n\r\n";
} else {
print TXT "$array[0] 殿\r\n\r\n";
}
print TXT "あなたのパスワードは $array[1] です。\r\n";
print TXT "すぐパスワードを変更してくださいねー。\r\n";
print TXT "\r\n以上\r\n";
close TXT;
} else {
print STDERR "cannot create.\n";
}
}
引数に、先ほどと同じ CSV ファイルを指定します。 # chmod +x mkpasswdtxt.pl # ./mkpasswdtxt.pl user001-100.csv # ls -1 user*.txt user001.txt user002.txt ...中略... user100.txt # cat user001.txt User 001 殿 あなたのパスワードは 5ia4fAQk です。 すぐパスワードを変更してくださいねー。 以上 日本語は、スクリプトが EUC、 出力するテキストファイルが UTF-16 だと仮定しています。異なる場合は、 先ほどと同様、iconv の引数を適時変更してください。 実際に印刷する手順は、環境によると思いますので、 申し訳ありませんが割愛させていただきます。Windows で行うなら、 VBScript などで自動化できてしまうかもしれませんですね。 以上、ユーザ情報を一括管理したり、パスワードをお知らせする方法などを、 お知らせしました。 前回同様、さまざまなシチュエーションが想定されますので、 そのままで使えないかもしれませんが、 叩き台として参考にすることはできると思います。
また、いずれも、パスワードなど大切な情報を扱いますので、
各ファイルのパーミッションには、ものすごくご注意くださいませ。 宿題の答え前回の宿題は、 複数のユーザを一括で削除するスクリプトを作成しましょう。 でした。 自由度を考えず、ごそっと一括で消すなら、こんな感じでしょうか。
#!/bin/sh
[ $# -eq 1 ] && TOTAL=$1 || TOTAL=100
num=1
while [ $num -le $TOTAL ]; do
user=`printf "user%03d" $num`
`userdel -r $user` && echo "$user deleted"
num=`expr $num + 1`
done
引数なしで実行しますと、user001〜user100 を、一括削除します。 あるいは、引数で指定したユーザを削除するなら、以下の通りです。
#!/bin/sh
while [ $# -gt 0 ]; do
`userdel -r $1` && echo "$1 deleted"
shift
done
引数を、そのまま userdel コマンドに渡しているだけ、ですね。 さらにあるいは、一括登録で使用した CSV ファイルを使って、一括削除を行うなら、 以下のようになります。
#!/bin/sh
IFS=','
while read acct pass uid gid gcos hdir shell; do
`userdel -r $acct` && echo "$acct deleted"
done
実行時に CSV ファイルをリダイレクトすると、ごそっと読み出し、 先頭のユーザ名だけを userdel コマンドに渡します。それだけです。
以上、簡単ではありますが、いろんな解答例を、ご紹介しました。 今回の宿題今回の宿題は、 CSV ファイルから、ユーザを復元するスクリプトを作りましょう。 です。 うっかり userdel してしまったのだけれど元に戻したいとか、 丁稚奉公に行っていたあのひとが帰ってきたのでとか、 いくつかシチュエーションは考えられると思います。 手元に情報が残っていれば、 useradd コマンドなどで復元することも可能ではないかと思います。そんなものを、 考えてみてくださいませ。 あとがきおもむろに Open Tech Press を眺めていたところ、 Web Console とやらの紹介記事を見つけました。
Open Tech Press | Web Consoleで行うリモート操作でのサーバ管理
Web Console Ajax を使って、ブラウザ上でサーバのシェルを使ってしまおうという、 なんとも豪儀なコンセプトをお持ちのソフトのようです。 基本的には、単体の CGI だけで動きますので、設定手順は簡単です。 上記のページから ZIP ファイルを得て(あるいは subversion で入手)、 httpd が読み書きできて、CGI が動作して、 かつ .htaccess を解釈してくれるディレクトリの下に展開します。 そしてあとは、CGI にアクセスして、簡単な設定を行えば、 ブラウザ上でシェルがさくさく動作するようになります。
CGI ですので、Web Console でできることは、httpd ができることに限定されます。
ですが、sudo コマンドを使えば、その壁をとっぱらうことが可能です。 なにはともあれ、設定は比較的艦単ですので、さくっとシェルが動くさまを、 実際に見てみてくださいませ。
いまどき、VNC などもブラウザ上で動いてしまいますので、
それほど驚愕ではないかもしれませんが、
やりとりするデータが文字だけで済みますので、
他よりもさくさくと快適に動作するというメリットはありそうです。 ここのところ、仕事以外ではなにも作っていませんでしたので、 ぼちぼちなにか作りたいなあと、いい感じに創作意欲をかきたてられました。
それはさておき、Debian の OpenSSL の脆弱性の問題が、 あちこちに波及しているようですね。
Debian そのものだけでなく、Debian 上で生成した SSH の鍵や、
SSL の証明書も問題になります。
OpenSSL パッケージの脆弱性とその影響について (SSH鍵、SSL証明書等) 試しに、手元のノート(Vine)で確認したところ、なんと見つかりました。 % ./dowkd.pl file .ssh/known_hosts .ssh/known_hosts:50: weak key .ssh/known_hosts:54: weak key summary: keys found: 56, weak keys: 2
とはいえ、いずれも今はなきマシンでしたので、
問題の行をさくさくっと削除するだけで済みました。
今回も、ここまで読んでいただき、ありがとうございました。
「いますぐ実践! Linux システム管理」の解除は、以下からできます。
バックナンバーは、こちらにほぼ全部そろっています。
「栗日記」− グッズを作って広めたい病にかかったかもしれません…。 |
▼ トップ ▼ プロフィール ▼ リンク
▼ 作ってみました
▼ せんでん
▼ 最近読んだ本 [X]
「センネン画報」 今日 マチ子「粟津潔 デザインする言葉」 粟津潔 「Binary Hacks」 高林 哲,鵜飼 文敏,佐藤 祐介,浜地 慎一郎,首藤 一幸 「Make: Volume01」 オライリー・ジャパン 「セーラが町にやってきた」 清野 由実 「手紙屋」 喜多川 泰 「Linuxカーネル2.6解読室」 高橋 浩和,小田 逸郎,山幡 為佐久 「人蕩し術」 無能 唱元 「子育てハッピーアドバイス2」 明橋 大二, 太田 知子 「ラッセル幸福論」 B. Russell 「それでも人生にイエスと言う」 Viktor Emil Frankl 「子育てハッピーアドバイス」 明橋 大二, 太田 知子 「考具」 加藤 昌治 「北欧デザイン<3>」 渡部 千春 「北斎の謎を解く」 諏訪 春雄 「体感美術館」 平野 暁臣 「チベット永遠の書」 Theodore Illion 「リナックスの革命」 Pekka Himanen 「人月の神話」 Frederick Phillips,Jr. Brooks 「ヤバい経済学」 Steven D. Levitt, Stephen J. Dubner 「小布施ッション<2001-2002>」 セーラ・マリ カミングス 「アンパンマン伝説」 やなせ たかし 「夢をかなえるゾウ」 水野 敬也 「ゲーム開発者のためのAI入門」 David M. Bourg, Glenn Seemann 「北欧デザイン<2>」 渡部 千春 「北欧デザイン<1>」 渡部 千春 「ヒューマン2.0」 渡辺 千賀 「中国・ロシア同盟がアメリカを滅ぼす日」 北野 幸伯 「超ロング・セラー 絶滅寸前商品」 湯浅 豊彦 「The BUG(ザ・バグ)」 すずき ひろのぶ,かとう みつあき 「デザインのデザイン」 原 研哉 「マキアヴェッリ語録」 塩野 七生 「ハンバーガーを待つ3分間の値段」 斎藤 由多加 「星の旅人-スペイン「奥の細道」-」 黛 まどか 「食品の裏側」 安部 司 「On Lisp」 Paul Graham 「ぼくが医者をやめた理由 つづき」 永井 明 「あなたならどうする?」 Jack Nikolaschka 「セキュアプログラミング−失敗から学ぶ設計・実装・運用・管理」 Mark G. Graff, Kenneth R. van Wyk 「「左利き」は天才?−利き手をめぐる脳と進化の謎」 David Wolman 「自分の中に毒を持て」 岡本 太郎 「アトピーの薬を減らす本」 田中 貴子 「岡本太郎「明日の神話」修復960日間の記録」 吉村 絵美留 「X51.ORG THE ODYSSEY」 佐藤 健寿 「アレルギーっ子の暮らし応援BOOK」 佐藤 のり子 「沖縄文化論」 岡本 太郎 「「伝説の社員」になれ!」 土井 英司 「コンピュータの構成と設計(上)」 Patterson & Hennessy 「カラスのジョンソン」 明川 哲也 「ドリルを売るには穴を売れ」 佐藤 義典 「頭がよくなる照明術」 結城 未来 「クロフォードのインタラクティブデザイン論」 Chris Crawford 「いじめの根を絶ち子どもを守るガイド」 Barbara Coloroso 「非常識のすすめ―逆発想の仏教論」 ひろさちや 「Linuxアドバンストネットワーク構築ガイド - HAサーバ構築編」 デージーネット 「イノベーションの達人!」 Tom Kelly, Jonathan Littman 「クリエーター50人が語る創造の原点」 小原 啓渡 「欺術 - 史上最強のハッカーが明かす禁断の技法」 Kevin Mitnick 「楽しい気象観察図鑑」 武田 康男 「入門 Ajax」 高橋 登史朗 「リリカルな自画像」 岡本 太郎 「やぎの目ゴールデンベスト」 林 雄司 「初めてのPython 第2版」 Mark Lutz,David Ascher 「鼻兎」 小林 賢太郎 「なぜ、これがアートなの?」 Amelia Arenas 「芸術起業論」 村上 隆 「まほう色の瞳」 Enrique Barrios 「ラーメンズつくるひとデコ」 ラーメンズ 「R25 つきぬけた男たち」 R25編集部 「美の呪力」 岡本 太郎 「しろのあお」 上大岡 トメ 「ザ・ゴール」 Eliyahu M. Goldratt 「ハッカーと画家」 Paul Graham 「岡本太郎に乾杯」 岡本 敏子 「Fedore Core Expert」 Software Design 「誰も知らない男」 ブルース・バートン 「子どもが育つ魔法の言葉」 ドロシー・ロー・ノルト 「国家の罠」 佐藤 優 「夜回り先生」 水谷 修 「やぎの目絵日記」 林 雄司 「7つの習慣」 スティーブン・R. コヴィー 「まろ、ん?−大掴源氏物語」 小泉 吉宏 「ザ・サーチ グーグルが世界を変えた」 ジョン・バッテル 「ポストモダン・マーケティング」 スティーブン ブラウン 「機動戦士ガンダムさん」 大和田 秀樹 「小エロのひみつ - Webやぎの目研究発表」 林 雄司 「これ、誰がデザインしたの?」 渡部千春 「60分間・企業ダントツ化プロジェクト」 神田 昌典 「ガルシアへの手紙」 エルバート ハバード 「人生は素晴らしいものだ」 オグ・マンディーノ 「ザ・マインドマップ」 トニー・ブザン,バリー・ブザン 「ワインバーグのシステム思考法」 G.M.ワインバーグ 「渋谷ではたらく社長の告白」 藤田 晋 「渋井真帆の日経新聞読みこなし隊」 渋井 真帆 「コラム息切れ」 小野 法師丸 「早朝起業」 松山 真之介 「変な人が書いた驚くほどツイてる話」 斎藤 一人 「35歳から仕事で大切にしたいこと」 村井 勉 「金融広告を読め」 吉本 佳生 「発想する会社!」 トム・ケリー,ジョナサン・リットマン 「エハイク」 吉田 戦車 「人生の旋律」 神田 昌典 「仕事の思想」 田坂 広志 「CPUの創りかた」 渡波 郁 「非常識な成功法則」 神田 昌典 …これ以前は記録してません…
▼ 気に入ってる本
| ||||||||||||||||||||||||||||||||||||||||