いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.167 / 読者数:1353名

こんばんは、うすだです。

わたくしのいまの本業はプログラマーですが、プログラマーでもシステム管理者でも、 日々 PC に向かってせっせと仕事をする、 というスタイルはまったく同じではないかと思っております。
(厳密には、システム管理者のほうが、時に肉体労働を伴うかもですね。)

ずっとそのままの姿勢でいますと、体にも目にも悪いですので、 トイレへ行くときのついでに、非常階段で、 遠くを見ながら柔軟体操などするようにしています。

今ですと、いろんなサイトに、体をほぐす方法が掲載されていますよね。
よさげな方法を見つけるたびに、片っ端から実践しています。
たとえば以下のようなことを、おおざっぱではありますが行っています。

上記以外にも、新聞で読んで、うろ覚えで行っているものもあります。
ですので、結構な種類をこなしているはずなのですが、それだけ実行している割には、 肩こりがよくなりません。骨折り損な気がしております。

やらなければ肩こりがもっとひどかったのだ、 とポジティブにシンキングすることにしまして、今回も、 はりきってまいりたいと思います。

■ 今回のお題 - ログインをあれこれ制御する

いまどきは、一般のユーザがサーバにログインしてどうこうする、という機会が、 めっきり少なくなってきたように思います。

しかし、われわれシステム管理者は、 各種サーバをぜんぶ一人で管理するわけにはいきませんので、 管理者の方々がログインして、 各種管理作業を行えるようになっているのではないかと思います。

ですので、 不正なアクセスが行われても問題ないように設定しておく必要がありますし、 常に各種ログをチェックする必要もありますよね。

というわけで今回は、ログインに関連するログを参照したり、 ログインを制限する方法などを、ご紹介したいと思います。

以降では、各ログを、名称だけで記載していますが、 実際のパスは以下のようになっています。(Linux 以外は微妙に異なるかもです。)

  utmp: /var/run/utmp - 現在のログイン情報
  wtmp: /var/log/wtmp - 今までのログイン情報
  lastlog: /var/log/lastlog - 一番最近ログインしたときの情報
  btmp: /var/log/btmp - ログインに失敗したときの情報

適時、実際のパスに置き換えて読んでいただければと思います。

どういう状態がログインなのか?

今回のお題を考え始めたとき、 そもそもログインとはどういう状態のことを表すのだろうか、 という疑問がわいてきました。

そこで、ログイン情報を出力するwhoコマンドや、 ログインの処理を行うloginコマンドを調べてみました。 (必殺! ソースの斜め読みです。)

loginコマンドは、ttyの処理を行ったり、PAMを利用して認証を行ったりした後、 utmp や wtmp などに情報を記録して、最後にシェルをexecしていました。 (…はい、かなりおおざっぱに書いております。)

また、whoコマンドは、単に utmp の情報を出力しているだけでした。

ということは、現在ログインしているかどうかは、 utmpに記録されているかどうかで決まる、と言ってよさそうです。

たとえば、SSH で遠くからログインしたときや、 GDMなどグラフィカルなログイン画面からログインしたときは、 utmp に情報を記録してくれますので、ログインしたということになります。

かたや、GNOME端末などを起動しても、 すでにログインした画面から端末エミュレータを介してシェルを起動しているだけですので、 utmpに記録はされないわけですね。
(そもそも一般ユーザの権限では utmp に書き込めませんが…。)

ちなみに、過去のログイン情報は wtmp、 一番最近ログインした各ユーザの情報は lastlog に記録されています。
そして、パスワードの入力間違いなどで、ログインできなかった際には、 btmp にその旨が記録されます。

ログイン情報を見る

では次に、各種ログイン情報を見るコマンドを、いくつかご紹介します。

まず、現在のログイン情報を出力するコマンドには、 先ほど名前だけ挙げました who コマンドと、w コマンドがあります。

who コマンドは、utmp の情報を出力するためのコマンドです。
引数なしで起動すると、現在ログイン中のユーザの情報が出力されます。

  $ who
  usu      :0           2009-10-17 13:35
  usu      pts/7        2009-10-17 20:24 (www.usupi.org)

utmp には、ランレベルや、システムの起動時間などの情報も記録されています。 たとえば -a オプションを指定しますと、いろいろ出力します。

  $ who -a
                        Oct 17 13:33       803 id=si term=0 exit=0
           system boot  Oct 17 13:33
           run-level 5  Oct 17 13:33           last=S
  LOGIN    tty1         Oct 17 13:34      3693 id=1
  ...

w コマンドは、実行中のコマンドなどの情報も出力してくれます。

  $ w
  USER   TTY    FROM            LOGIN@   IDLE   JCPU   PCPU WHAT
  usu    :0     -              13:35   ?xdm?   6:39   1.83s ....
  usu    pts/7  www.usupi.org  20:24    1:12m  0.05s  0.05s -bash

また、wtmp の内容は、last コマンドで確認できます。

  $ last
  usu    pts/7       www.usupi.org  Sat Oct 17 20:24 still logged in
  usu    :0                         Sat Oct 17 13:35 still logged in
  reboot system boot 2.6.16         Sat Oct 17 13:33        (08:05)
  usu    :0                         Fri Oct 16 20:58 - down (03:48)
  reboot system boot 2.6.18.8-xen   Fri Oct 16 20:57        (03:50)
  ...

ちなみに、utmp と wtmp は同じフォーマットですので、 who コマンドで wtmp を参照することもできます。

  $ who /var/log/wtmp
  usu    :0           2009-10-01 22:18
  usu    :0           2009-10-02 09:55
  ...

それから、lastlog は、同名の lastlog コマンドで参照できます。
ただし、ご使用の環境によっては、root の権限が必要です。
(/var/log/lastlog のパーミッションによります。)

  # lastlog
  Username    Port   From          Latest
  root        :0                   Fri Jun 19 16:09:21 +0900 2009
  bin                              **Never logged in**
  daemon                           **Never logged in**
  adm                              **Never logged in**
  ...
  usu       pts/7   www.usupi.org  Sat Oct 17 20:24:55 +0900 2009
  ...

長ったらしくて見づらいときは、-u オプションでユーザを指定するか、 grep コマンドにお願いして必要な情報だけに絞りましょう。

  # lastlog -u usu
  Username    Port   From          Latest
  usu       pts/7   www.usupi.org  Sat Oct 17 20:24:55 +0900 2009
  # lastlog | grep -v '\*\*'
  root        :0                   Fri Jun 19 16:09:21 +0900 2009
  usu       pts/7   www.usupi.org  Sat Oct 17 20:24:55 +0900 2009
  postgres                         Sat Sep  8 20:48:04 +0900 2007

そして、btmp の情報を見るには、lastb コマンドを実行します。

  # lastb
  usu   ssh:notty  www.usupi.org  Sat Oct 17 20:24 - 20:24 (00:00)
  usu   tty3                      Sat Oct 17 17:53 - 17:53 (00:00)
  usu   pts/6      localhost      Sat Oct 17 17:50 - 17:50 (00:00)
  usu   pts/6      localhost      Sat Oct 17 17:50 - 17:50 (00:00)

  btmp begins Sat Oct 17 17:50:42 2009

そもそも btmp がない場合は、以下のように作成しましょう。
btmp があれば、失敗した情報が記録されていくはずです。

  # touch /var/log/btmp
  # chmod 600 /var/log/btmp

root のログインを制限する

さて、お次は、root でログインできないようにしてみたいと思います。

/etc/securetty というファイルがありまして、これには、1行に1つ、 tty の名前が記述されています。
ここに書かれた tty からは、root で直接ログインできます。

  $ cat /etc/securetty
  console
  vc/1
  ...
  tty1
  ...

たとえば、/etc/securetty から、tty1 の行を消してみます。

  # cp -p /etc/securetty /etc/securetty.ORG
  (↑もとに戻せるようバックアップをとっておきます。以降も同様。)
  # vi /etc/securetty
  (↑tty1 の行を消して保存します。vi でなくてもなんでもいいです。)

そして、[Ctrl]+[Alt]+[F1]を押して仮想コンソール1に移動し、 root でログインを試みてください。

  login: root
  Password: (root のパスワードを入力します)
  Login incorrect

…ああ、ログインできなくなってしまいました。

逆に、仮想端末を追加しておくと、 telnet などから root でログインができてしまいます。 (telnetd などが動いていれば…ですが。)

  # for n in 0 1 2 3 4 5 6 7 8 9; do
  > echo pts/$n
  > done >> /etc/securetty

それから、上記を試した後は、バックアップしておいたファイルを戻しておきましょう。

  # mv /etc/securetty.ORG /etc/securetty

なんびとたりともログインできなくする

はい、ちょっと疲れてきましたが、あと少しですのでがんばりましょう。

/etc/nologin というファイルがありますと、root 以外のひとは、 だれであってもログインができなくなります。

  # touch /etc/nologin

ちなみに、/etc/nologin に何か書いておきますと、ログインを拒否するときに、 内容を出力してくれます。
たとえば、以下のような内容にしておきますと、

  # cat > /etc/nologin << E-O-F
  > I'm doing backup now.
  > Try later.
  > E-O-F

こんなふうに出力されます。

  $ slogin www.usupi.org
  Password:
  I'm doing backup now.
  Try later.

おっと、上記を試した後は、/etc/nologin を消しておきましょう。
でないと、一般ユーザのひとはログインできなくなってしまいます。

  # rm /etc/nologin

おわりに

以上、ログインに関するあれこれを、お知らせしました。

utmp, wtmp につきましては、過去でネタにしております。

Vol.025 - ログイン情報を知る
http://www.usupi.org/sysad/025.html
Vol.026 - ログイン情報をでっちあげる
http://www.usupi.org/sysad/026.html
Vol.027 - utmp - もうひとつのログイン情報
http://www.usupi.org/sysad/027.html

また、/etc/nologin や /etc/securetty による制御は、PAMで実現されています。 PAM につきましては、以下で取り上げております。

Vol.105 - PAM の設定を理解する
http://www.usupi.org/sysad/105.html
Vol.106 - PAM をカスタマイズする
http://www.usupi.org/sysad/106.html

というわけで、今回はやや二番煎じ的な内容でしたが、 過去の情報に少し曖昧なところがありましたので、 その修正も含めてお送りした次第です。

少なくとも、ログを参照するコマンドを実行しても、 システムがおかしくなることはありませんので、是非実行してみてください。

宿題の答え

前回の宿題は、

  スナップショットの余裕がなくなってきたらサイズを増やすスクリプト
  を作ってみましょう。

でした。

使用状況は、lvdisplay コマンドの出力結果からわかります。

  # lvdisplay /dev/Volume00/LogVol00_snap
    --- Logical volume ---
     ...中略...
    COW-table size         40.00 MB
    COW-table LE           8
    Allocated to snapshot  0.07%
     ...後略...

Allocated to snapshot の値が、もとのデータを保存するために使用中の領域です。 作りたてほやほやですので、ほぼ 0% ですね。
これが、ある閾値を越えたときに、 lvextend コマンドで領域を増やしてあげればよいわけですね。

  lvextend -L +増やす量 /dev/Volume00/LogVol00_snap

というわけで、まずは、作ってみた Perl スクリプトを以下に示します。
現在の使用率(%)がある閾値(上限(%))を越えていたら、下限(%)を下回るまで、 ひたすら lvextend するというものです。
(いろいろかしこくない出来ではありますが、動作はしますので、 大目に見てやってくださいませ。)

  #!/usr/bin/perl
  use strict;
  use warnings;
  my $SNAPDEVICE = "/dev/Volume00/LogVol00_snap";
  my $UPPER_THRESHOLD = 70;  # 上限(%)
  my $LOWER_THRESHOLD = 40;  # 下限(%)
  my $ADDSIZE = "4M";        # 増やす単位

  # 現在の使用率(%)を得るためのサブルーチン(手抜き)
  sub get_percent {
      my $ret = `/usr/sbin/lvdisplay $SNAPDEVICE | \
          sed -n 's/^ *Allocated to snapshot *\\([0-9\\.]*\\)% *\$/\\1/p'`;
      chomp $ret;
      return $ret ? $ret:-1;
  }

  my $per = &get_percent();
  my $per0 = $per;
  if($per < 0) {
      die "Cannot get allocated percentage.\n";
  } elsif($per > $UPPER_THRESHOLD) {
      # 上限を越えていたら、下限を下回るまで lvextend で増やす
      while($per >= $LOWER_THRESHOLD) {
          `/usr/sbin/lvextend -L +$ADDSIZE $SNAPDEVICE`;
          last if $?;
          $per = &get_percent();
      }
  }
  print "$SNAPDEVICE used $per0 ",
      (($per0 != $per) ? "to $per %\n":"% (not changed)\n");

見ての通り、上限を 70%、下限を 40%、lvxtend で増やす単位を 4MB としています。 適時、都合のよい値に変更してくださいませ。
(あ、もちろん、$SNAPDEVICE をご使用のデバイスに変更してください。)

このスクリプトを、expandsnap.pl というファイル名で保存したとしますと、 いつものように、実行権をつけて実行してみます。

  # chmod +x expandsnap.pl
  # ./expandsnap.pl
  /dev/Volume00/LogVol00_snap used 53.44 % (not changed)

おっと、上限の 70% より小さいため、なにも起こりませんでした。

これでは先に進めませんので、使用率が 70% を越えるよう、 オリジナルのデバイスに対して、いろいろと変更を加えてみます。
(すでにあるファイルを変更するのが、てっとり早いと思います。)

あれこれ変更を加えて、以下のように、70% を越えたと仮定しましょう。
(なんとかの3分間クッキングみたいですね。)

  # lvdisplay /dev/Volume00/LogVol00_snap | grep Allocated
    Allocated to snapshot  74.38%

ここで、再度スクリプトを実行しましょう。

  # ./expandsnap.pl
  /dev/Volume00/LogVol00_snap used 74.38 to 49.66 %
  # lvscan
    ACTIVE   Original '/dev/Volume00/LogVol00' [144.00 MB] inherit
    ACTIVE   Snapshot '/dev/Volume00/LogVol00_snap' [60.00 MB] inherit

スナップショットのサイズが、40MB から 60MB に増やされ、その結果、 使用率を 73.48% から 49.66% にまで下げることができました。

もちろん、上限と下限を同じ値にしても動作します。
たとえば、上限も加減も 40% に設定しますと、以下のようになります。

  # ./expandsnap.pl
  /dev/Volume00/LogVol00_snap used 49.66 to 39.21 %
  # lvscan
    ACTIVE   Original '/dev/Volume00/LogVol00' [144.00 MB] inherit
    ACTIVE   Snapshot '/dev/Volume00/LogVol00_snap' [76.00 MB] inherit

以上です。…といいますか、それだけです。

もし万が一使う機会がありましたら、 各種パラメータをオプションで指定できるようにしたり、 処理内容を詳細に出力するなどしてみてください。

今回の宿題

今回の宿題は、

  /etc/securetty がない場合、rootのログインは許可されるでしょうか?

です。

一瞬 rename して、試してみるだけですよね。
実践あるのみ! ですので、是非やってみてくださいませ。

あとがき

先日、いとこのお芝居のチラシのイラストなどを、お願いされて描いたのですが、 その芝居と打ち上げが本日ありまして、なぜかお呼ばれしましたので、 行ってまいりました。

結局、なんやかんやで打ち上げが終わったのが23時半を過ぎていまして、 帰路の途中で電車がなくなってしまいました。
(名古屋の夜は早いんですよ。今日は日曜日ですしね。)

幸い、我が家のやや近くのいとこのおうちまではたどりつけましたので、 自転車をお借りして、無事家にたどり着くことができました。

そんなわけで、いまこの文章を書いております。
土曜日のうちに、ある程度の下調べと、文章を書いていましたので、 この時間(いま2時です)にあわてることなく、仕上げることが出来そうです。

備えあれば憂いなし、というのはほんとに大事なんだな、と思います。

…ものすごく当り前のことですが、今実感していることですので、 あえて書かせていただきたいと思います。

そもそも、備えがあれば、終電に間に合うよう帰ってくるんじゃないの? というツッコミに対しては、返す言葉がございませんが…。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、11月1日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 栗モノを手当たりしだい喰らいました。もう十分っす。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本