2011年9月13日火曜日

mii-tool と ethtool

Linuxでネットワークインターフェースの状況を確認するときに使えるコマンド。

mii-tool

$ man mii-tool
NAME
        mii-tool - view, manipulate media-independent interface status
(略)

指定したインターフェース(et0, eth1 など)の状況を表示する。-wオプションを使うとlink status の変化を検出してくれる。たとえば、VMWareなどのゲストOS上で実験すると面白い。

仮想スイッチに接続したゲストOSで mii-tool -w を実行してみる

VMWare Fusion on Mac OS 10.6.8 にインストールしたゲストOS(CentOS-6.0)で eth1に対して mii-tool -wを実行。

仮想ネットワークの設定を開く。

「接続」のチェックボックスをオフにする。これで、仮想的にネットワークケーブルを抜いた状態になる。

すると、mii-tool の出力が変化してno linkになる。

「接続」のチェックボックスをオンに戻すと、もとに戻る。

このように mii-tool は楽しいのだが、obsoleteであるからなるべく使わないほうがよいらしい(その代わりにethtoolを使う)。

ethtool

$ man ethtool
NAME
        ethtool - Display or change ethernet card settings
(略)

ethtool は mii-tool に比べると多機能でオプションが多いので、とりあえずNICの状態を調べる。

# ethtool eth1
Settings for eth1:
 Supported ports: [ TP ]
 Supported link modes:   10baseT/Half 10baseT/Full 
                         100baseT/Half 100baseT/Full 
                         1000baseT/Full 
 Supports auto-negotiation: Yes
 Advertised link modes:  10baseT/Half 10baseT/Full 
                         100baseT/Half 100baseT/Full 
                         1000baseT/Full 
 Advertised pause frame use: No
 Advertised auto-negotiation: Yes
 Speed: 1000Mb/s
 Duplex: Full
 Port: Twisted Pair
 PHYAD: 0
 Transceiver: internal
 Auto-negotiation: on
 MDI-X: Unknown
 Supports Wake-on: d
 Wake-on: d
 Current message level: 0x00000007 (7)
 Link detected: yes

上述の mii-tool -w のようにケーブルの状態をチェックするなら、たとえば watchと組み合わせて

# watch -n 1 "ethtool eth1|grep 'Link detected'"

とすれば間に合う(下の画像のように表示される)。

2011年9月8日木曜日

yum groupinstall ほか

yumのパッケージを複数まとめたもの、つまり「パッケージグループ」をインストールするためのコマンドが yum groupinstall

メール、DNS、WWW等のサーバー用Linuxに、後になってデスクトップ環境を入れようとすると大量のパッケージを追加インストールしなければならないのだが、そういった場合に役にたつ。

そして、パッケージグループ関連のコマンドは、groupinstallのほかにも

  • grouplist
  • groupinfo
  • groupupdate
  • groupremove

…等がある。

yum grouplist の例

# yum grouplist
Loaded plugins: fastestmirror
Setting up Group Process
Loading mirror speeds from cached hostfile
 * base: mirror.khlug.org
 * extras: data.nicehosting.co.kr
 * updates: data.nicehosting.co.kr
Installed Groups:
   Additional Development
   Arabic Support
(略)
   Web Server
Available Groups:
   Afrikaans Support
   Albanian Support
(略)
   iSCSI Storage Client
Done

yum groupinfo の例

# yum groupinfo Desktop
Loaded plugins: fastestmirror
Setting up Group Process
Loading mirror speeds from cached hostfile
 * base: mirror.khlug.org
 * extras: data.nicehosting.co.kr
 * updates: data.nicehosting.co.kr

Group: Desktop
 Description: A minimal desktop that can also be used as a thin client.
 Mandatory Packages:
   NetworkManager
   NetworkManager-gnome
   alsa-plugins-pulseaudio
(略)
 Default Packages:
   eog
   gdm-plugin-fingerprint
(略)
 Optional Packages:
   control-center-extra
   sabayon-apply
   tigervnc-server
   xguest

2011年9月3日土曜日

Linux の /proc/crypto

/proc/crypto を見ると、Linuxカーネルがどのような暗号化アルゴリズム(cryptographic cipher)を使用しているかがわかる、という話


/proc/crypto の例

CentOS-6.0 で /proc/crypto を見てみた。

# cat /proc/crypto
name         : xts(aes)
driver       : xts(aes-asm)
module       : kernel
priority     : 200
refcnt       : 1
selftest     : passed
type         : givcipher
async        : no
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
geniv        : eseqiv
(略)

name だけ grep してみた。

# grep '^name' /proc/crypto
name         : xts(aes)
name         : xts(aes)
name         : sha256
name         : sha224
name         : cbc(aes)
name         : cbc(aes)
name         : aes
name         : aes
name         : stdrng
name         : crc32c
name         : sha1
name         : md5

暗号化モジュールをロードしてみる

カーネルが使用できる暗号を追加したい場合は、該当するモジュールをロードしてやればいい(modprobe 等のコマンドを使う)。

例:blowfish暗号を追加

# modprobe blowfish

lsmod, modinfoで、ロードされたモジュールを確認。

# lsmod |grep blowfish
blowfish                7850  0 

# modinfo blowfish
filename:       /lib/modules/2.6.32-71.29.1.el6.x86_64/kernel/crypto/blowfish.ko
description:    Blowfish Cipher Algorithm
license:        GPL
srcversion:     3D0BFB5C93D66CBA1C92FA2
depends:        
vermagic:       2.6.32-71.29.1.el6.x86_64 SMP mod_unload modversions 

/proc/crypto も確認。

cat /proc/crypto
name         : blowfish
driver       : blowfish-generic
module       : blowfish
priority     : 0
refcnt       : 1
selftest     : passed
type         : cipher
blocksize    : 8
min keysize  : 4
max keysize  : 56
(略)

dm-crypt での例

dm-crypt は、ディスク暗号化のための仕組み(a device-mapper crypto target)。dm-crypt を使用すると、/proc/crypto の内容が変化する。つまり、 dm-crypt が Linuxカーネルの暗号化モジュールを利用している、ということが分かる。

テキトーにdm-cryptを使って暗号化してみる

/dev/sdc1 を blowfish の CTRモード で暗号化して mapping01 にマップ。

# cryptsetup create -y -c blowfish-ctr-plain mapping01 /dev/sdc1

/proc/crypto を見てみる。

# cat /proc/crypto
name         : ctr(blowfish)
driver       : ctr(blowfish-generic)
module       : kernel
priority     : 0
refcnt       : 2
selftest     : passed
type         : givcipher
async        : yes
blocksize    : 1
min keysize  : 4
max keysize  : 56
ivsize       : 8
geniv        : chainiv

name         : ctr(blowfish)
driver       : ctr(blowfish-generic)
module       : ctr
priority     : 0
refcnt       : 2
selftest     : passed
type         : blkcipher
blocksize    : 1
min keysize  : 4
max keysize  : 56
ivsize       : 8
geniv        : chainiv

name         : blowfish
driver       : blowfish-generic
module       : blowfish
priority     : 0
refcnt       : 2
selftest     : passed
type         : cipher
blocksize    : 8
min keysize  : 4
max keysize  : 56
(略)

…というように、CTR とか blowfish のモジュールがロードされたのが分かる。

なお、 dm-crypt に関しては、なるべくデフォルトの暗号化アルゴリズムとモードを使ったほうがよいようだ。というのは、2011-06-28頃のメーリングリストでそのように主張されていたから(AES + CBCモード + ESSIV を使いましょう、とのこと)。


2011年9月1日木曜日

openssl の s_client -sess_out と sess_id

-sess_outsess_id が便利だったのでメモ。


openssl s_client コマンド

openssls_clientは、サーバーとのSSL通信を確認するためのコマンド。いろいろな場面で応用できる。


-sess_out オプション

-sess_out を使うと、openssl s_client の結果(SSLセッション情報)をファイルに記録することができる。

$ openssl s_client -connect smtp.gmail.com:587 -starttls smtp -sess_out sess_out.txt

上の例では、sess_out.txtに記録される(鍵の情報が含まれているので、扱いには要注意)。

$ cat sess_out.txt
-----BEGIN SSL SESSION PARAMETERS-----
MIIEdQIBAQICAwEEAgAFBCCiljn8yfXmDAlDzxlv53HgKo02ds87ncxERAAfYxf2
(略)
-----END SSL SESSION PARAMETERS-----

ただし、cat で表示してみると分かるように、PEMエンコードされているためそのままでは読めない。


openssl sess_id コマンド

SSLセッション情報を解読するためのコマンドとして、openssl sess_id が提供されている。

$ openssl sess_id -text -noout -in sess_out.txt
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0005
    Session-ID: A29639FCC9F5E60C0943CF196FE771E02A8D3676CF3B9DCC4444001F6317F68E
    Session-ID-ctx:
    Master-Key: 0FF83FC108F7A09BD6E9D76CD707804B6DFCCA3520EA13574B42EE40E21718D651432D79645AB91DAF2937D9373D1F97
    Key-Arg   : None
    Krb5 Principal: None
(略)
    Start Time: 1314886612
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

上の例のように、Protocol, Cipher, Session-ID, Master-Keyなど、SSLセッションを特徴づけるデータが分かる。

このコマンドのオプションは man sess_id で確認ができる。

2011年8月29日月曜日

Nessus on CentOS-6.0

Vulnerability Scanner(脆弱性検査ツール) の Nessus を使ってみた。

Nessus について

Nessus (software) - Wikipedia, the free encyclopedia」に概要が書いてある。

そのほかの特徴を、思いつくまま挙げた:

  • 商用利用の場合は有料ユーザー登録が必要(register to ProfessionalFeed
  • 商用でない場合も登録は必要(register to HomeFeed
  • バージョン 4.4 からWebインターフェースが提供されたため、クライアントソフト(NessusClient)のインストールが不要になった
  • コマンドラインインターフェース(CLI)もある
  • デフォルト「ポリシー」が4種類提供されている。これらをコピーして自分のポリシーを作成し、スキャンを実行する
  • 「プラグイン」を定期的に更新する必要がある(Nessus 4.4 Installation Guide によると普通は1日1回、場合によっては4時間に1回とのこと)

rpm をダウンロード

利用許諾のページ「Nessus Download Agreement | Tenable Network Security」から進んで、プラットフォームに合ったファイルをダウンロードする。今回の場合はRed Hat ES 6 (64 bits) / CentOS 6: Nessus-4.4.1-es6.x86_64.rpm をダウンロード。

インストールと設定

rpmでインストール。

# rpm -Uvh Nessus-4.4.1-es6.x86_64.rpm

あとは、Documentation のなかの Nessus 4.4 Installation Guide を読んで作業する(PDFファイル)。英語だが目次がきちんと整理されているので分かりやすい。

ポリシー作成とスキャンの実行

これも Documentation の Nessus 4.4 User Guide を読んで作業すれば難しくない。

以下は画面のキャプチャを適当に貼っていく。

ポリシーの編集画面

スキャン結果(Reports)

Severity が high のものが1個あった。

スキャン結果の詳細

Severity が high のものを掘り下げてみた。

スキャン結果の詳細

さらに掘り下げてみたところ、脆弱性に関する詳しい説明が表示された。

CVE-2011-3192と書いてあり、2011年8月19日に発見されたApacheの脆弱性のことだと分かる(脆弱性と対策は以下のリンク先に書いてある)。

対策を行ってから再度スキャンしてやると、当然ながらこの脆弱性はレポートから消えた。

tar コマンドの xattrs オプション

star

少し前の Linux(RedHat)では、SELinux や ACL の情報をもったファイルをアーカイブするときに star というコマンドを使うことになっていた。

ただし、このコマンドは圧縮のオプションが充実していなくて不便だった。

たとえば、gzip圧縮する場合には

$ star -H=exustar -xattr -c dir1 | gzip > dir1.tgz

のようにパイプやリダイレクトを行う必要があった(tar -z のような圧縮オプションが無いため)。

tar -xattrs

しかし、最近は tar が改良されて -xattrsオプションを使えばよくなったらしい(これで -j, -J, -z などの圧縮も使える)。

tar -xattrs の例

CentOS-6.0(Linux 2.6.32-71.29.1.el6.x86_64)にて確認。

準備
~/dir, ~/dir/file1, ~/dir/file2 を作って、テキトーにACLと拡張ファイル属性を設定。
$ cd
$ mkdir dir1 && touch dir1/file{1,2}
$ setfacl -R -m m:rwx dir1
$ setfattr -n 'user.test' -v 'test' dir1
$ setfattr -n 'user.test' -v 'test' dir1/file{1,2}
tar -xattrs でアーカイブ
$ tar --xattrs -cvzf dir1.tgz dir1
/tmp に展開して属性を確認
$ tar -xvzf dir1.tgz -C /tmp
$ getfacl -R /tmp/dir1
getfacl: Removing leading '/' from absolute path names
# file: tmp/dir1
# owner: useruuser
# group: useruuser
user::rwx
group::rwx
mask::rwx
other::r-x

# file: tmp/dir1/file2
# owner: useruuser
# group: useruuser
user::rwx
group::rw-
mask::rwx
other::r--

# file: tmp/dir1/file1
# owner: useruuser
# group: useruuser
user::rwx
group::rw-
mask::rwx
other::r--/

$ getfattr -d /tmp/dir1 /tmp/dir1/file*
getfattr: Removing leading '/' from absolute path names
# file: tmp/dir1
user.test="test"

# file: tmp/dir1/file1
user.test="test"

# file: tmp/dir1/file2
user.test="test"

…というわけで、tar -xattrs で拡張属性が保存されていることがわかった。

2011年8月23日火曜日

CentOS-6.0: semanage SELinux Command Not Found

CentOS-6.0 で semanage(SELinux用のコマンドラインツール)を使おうと思ったら command not found だった。

これはよくある話のようで、「RHEL 6: semanage SELinux Command Not Found」に回答を発見(厳密には RHEL6 向けの回答だが)。

要するに、# yum provides で欲しいファイルを指定すると、必要なパッケージがわかる。知らなかったので、覚えておきたい。