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

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

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

世間はお盆でしたが、充実した日々を過ごされましたでしょうか。

あ、わたくしは、普段より若干気の抜けた程度の生活をしておりました。

それはさておき、最近、我が家の電化製品がのきなみダメになる、 という現象が多発しています。

特にこの1週間がひどくて、食洗機と電子レンジが動かなくなりました。
どちらも、食生活のインフラと言っても過言ではありません。
お盆明け早々、修理に来ていただくことになっています。

その少し前は、炊飯器と掃除機が壊れました。 これらも日常生活における必需品ですので、たいそう困った覚えがあります。
寿命と言ってもよい状態でしたので、即効で新しいのを購入しました。

そういえば、昨年末には、TVが映らなくなるということもありました。
こちらも電気屋さんへあわてて買いに行った記憶があります。

…呪われているのでしょうか。厄年は終わったはずですが…。

このペースでいくと、次はメインの PC がダメになるかもしれないぞ… と少々ビクビクしています。
そうならないよう、ご先祖様に、きっちりお願いしておこうと思います。

お盆をやや悪用したところで、まあ、今回もはりきってまいりますね。

今回のお題 - ssh_config を設定してSSHを便利に使う

リモートのマシンへログインするのに、「SSH(Secure SHell)」が必須であることは、 今となってはだれも異論を唱えることのない、 超当たり前な常識なのではないかと思います。

ですが、telnetd や telnet がデフォルトでインストールされなくなり、 近くの社内サーバへのログインにも ssh が必要になった当初は、 なんでLANなのに ssh しないといかんのだ的な疑問を感じたものでした。
(…ああ、おそらくずいぶん前ですね…21世紀の初めくらいでしょうか。)

とはいえ、SSHの暗号化・復号化が片手間でできるほどCPUパワーが強大になり、 情報漏洩が社内からであることが珍しくなくなった現代において、 いつでもどこでも ssh を使うべきであることは、利にかなっています。

そんなわけで、 今では何の疑問も感じずに ssh や scp などをありがたく使わせていただいています。

ただ、わたしの場合、接続先によっていろいろ条件が変わるため、 ssh の実行の際には、いろいろなオプションを指定する必要があります。
で、毎回指定するのは面倒なので、シェルのaliasで短く設定したりなどしています。

ですが、みなさん、もう、そんな生活とは、おさらば、です。
クライアント側の設定(ssh_config)をちゃんとすれは、 そんな面倒くさい設定をしなくてもすみます。

というわけで今回は、ssh_config の設定を、いくつかご紹介します。

ssh_config とは?

まず、ssh_config について、超簡単に説明しておきます。

ssh_config とは、ssh や scp、 sftp などのSSHクライアントが使用する設定ファイルのことです。
各種SSHクライアントは、ssh_config の設定を用いて、動作します。

ユーザ毎の「~/.ssh/config」とシステム共通の「/etc/ssh/ssh_config」がありますが、 前者の設定の方が優先されます。
(ちなみに、オプションで指定された設定の方が、もっと優先されます。)

設定ファイルには、キーワードとその引数を、1行に1つ記述します。
詳しくは(…あまり詳しくありませんが)、以降で説明していきます。

主な設定をダイジェストで…

ここで紹介するキーワードは、~/.ssh/config でも /etc/ssh/ssh_config でも有効です。が、前者で設定されることを想定して話を進めます。

 

まず、真っ先に指定したいのが、ポート番号でしょう。(勝手に断言)

インターネット経由で入れるサーバの sshd を、 デフォルトの22番ポートのまま動かしていますと、 不埒な輩からの不正なアクセスに悩まされますので、 たいていはポート番号を変更して運用されていると思います。

ポート番号を指定するには、「Port」というキーワードを用います。
下記のように、ポート番号を指定すれば、そのポートに対して接続しようとします。 sshコマンドの「-p」オプションと同じですね。

  Port ポート番号

 

お次は、ユーザです。

通常は、ローカルのマシンのユーザ名でログインしようとします。
社内や部内など、どのマシンでも同じユーザであれば問題ないのですが、 客先のマシンなどの場合、みんなで1つのユーザを使っていたりすることがあるため、 違うことの方が多いのではないでしょうか。

ユーザ名を指定するには、「User」というキーワードを用います。
下記のように、ユーザ名を引数に指定すれば、そのユーザ名でログインを試みます。 sshコマンドの「-l」オプションと同じですね。

  User ユーザ名

 

前回にも少し出てきましたが、鍵をお使いの場合は、 「IdentityFile」というキーワードで秘密鍵のファイルを指定できます。
はい、sshコマンドの「-i」オプションと同じです。

  IdentityFile ファイル名

ちなみに、訳あって複数の秘密鍵をお持ちの場合は、 以下のようにすべて指定するということができます。よきものを使ってくださいます。

IdentityFile ~/.ssh/id_rsa.maria
IdentityFile ~/.ssh/id_rsa.rose
IdentityFile ~/.ssh/id_rsa.sina

 

お次は、ポート転送です。

ローカルホストのとあるポートにアクセスすると、ログイン先のマシンを介して、 リモートホストのとあるポートにアクセスできるという、 非常にありがたい機能がございます。
「LocalForward」というキーワードで、以下のように記述します。
sshコマンドの「-L」オプションとほぼ同じです。 ローカルのポート番号の後が「:」ではなく空白ですので、ご注意ください。

  LocalForward ローカルポート# リモートホスト:リモートポート#

こちらも、複数指定すれば、それらがすべて設定されます。

LocalForward 10122 192.168.1.1:22
LocalForward 10222 192.168.1.2:22
LocalForward 10280 192.168.1.2:80

また、-Lオプションと同様、ローカルホストでlistenするアドレスの指定もできます。

LocalForward 0.0.0.0:10180 192.168.1.1:80

通常は、ローカルホストからの接続しか受け付けませんが、 上記のようにlistenするアドレスを 0.0.0.0 にすると、 どこからでも接続を許可するようになります。 (場合によっては危険ですので、気をつけてください。)

  $ netstat -tan4 | grep 101
  tcp      0    0 127.0.0.1:10122       0.0.0.0:*          LISTEN
  tcp      0    0 0.0.0.0:10180         0.0.0.0:*          LISTEN

上記の場合、10122ポートは 127.0.0.1 で待ち受けているため、 ローカルホストからの接続しか受け付けません。ですが、 10180ポートは 0.0.0.0で待ち受けているため、どこからの接続でも受け付けます。

あるいは、「GatewayPorts」というキーワードを指定すると、 listenするアドレスを指定しなくても、0.0.0.0 になります。

GatewayPorts yes
LocalForward 10122 192.168.1.1:22
LocalForward 10180 192.168.1.1:80

GatewayPorts の引数には yes か no を指定します。(デフォルトは no)
これにより、10122 も 10180 も、0.0.0.0 で listen します。(怖い…)

逆方向のポート転送の場合には、「RemoteForward」というキーワードを用います。 sshコマンドの「-R」オプションとほぼ同じです。

  RemoteForward リモートポート# 近くのホスト:ポート#

こちらも、listenするアドレスを指定できますが、 ログイン先のマシンのsshdの設定で「GatewayPorts」が有効になっていないと、 意図した通りにlisten してくださいません。(ローカルホストからのみになります。)

Host で設定を分けられます

という感じで、ssh_config を使えばもろもろ指定できるのですが、 どのホストに接続する場合も条件が同じ、ということはあまりないですよね。

接続するホスト毎に設定を変えるには、「Host」というキーワードを用います。 Host を指定すると、それ以降の設定は、 そのホストに接続する際にのみ有効となります。

  Host ホストA
    ホストAのための設定
    ...
  Host ホストB
    ホストBのための設定
    ...

たとえば上記のように記述すると、Host ホストA と書いた行より後は、 ホストA に接続するときだけ有効な設定となります。

ここで、Host の引数に指定するホスト名は、実際のホスト名でなくてもかまいません。 その場合、「HostName」というキーワードで、実際に接続するホスト名を指定します。

Host myserver
  HostName www.usupi.org
  User master
  Port 822

ただし、sshコマンドなどで接続する際には、 Hostで指定した名前を指定する必要があります。

  $ ssh myserver
  master@www.usupi.org's password: 
  ...後略...

でないと、ssh_config の設定が使われません。

  $ ssh www.usupi.org
  ssh: connect to host www.usupi.org port 22: Connection refused

おわりに

以上、ssh_config の設定について、いくつかご紹介しました。

はい、みなさまもお気づきの通り、オプションで指定しているのと、 実質的には変わりません。

ですが、以下の理由により、ssh_config に記述した方がよい、 と言えるのではないかと思います。

  • ssh_config に書いておけば、 SSH関連のコマンドの間で設定を共有することができます。 alias だと、コマンド毎に設定が必要です。
  • ssh_config に書けばすぐ反映されますが、 シェルの alias だと設定を反映する必要があります。 (端末毎に . .bashrc 等の実行が必要)

宿題の答え

前回の宿題は、

  Fabric で、ホスト毎に違うSSHの鍵を指定して、実行するものを書いて
  みましょう。

でした。

SSHの鍵を env.key_filename に指定すれば、それが使われるのですが、 接続先ごとに鍵を変えたい場合、どうすればよいでしょうか、というのが宿題でした。

ぶっちゃけ、env.key_filename に配列で複数指定すればよいだけ…でした。

  env.hosts = ['ホスト1', 'ホスト2', ...]
  env.key_filename = ['鍵1', '鍵2', ...]

fabric の network.py にある key_filenames() と言う関数の中身を見ると、 配列じゃなかったら配列にする処理が含まれています。
(https://github.com/fabric/fabric/blob/master/fabric/network.py などにあります。)

  def key_filenames():
    ...中略...
    keys = env.key_filename
    if isinstance(env.key_filename, basestring) or
       env.key_filename is None:
        keys = [keys]
    ...後略...

ありがたいことに、ホスト毎に適切な鍵が使われるため、 ホストの並びに合わせて鍵を指定する必要はありません。

ちなみに、ssh_config の IdentityFile で指定した鍵は、 key_filenames()の最後で追加されるため、env.key_filename に指定しなくてよいです。

ただ、デフォルトでは ssh_config を見てくれないので、見てほしい場合は、 env.use_ssh_config に True を設定しましょう。

env.use_ssh_config = True

今回のお題の最後にもちらっと書きましたが、 ssh_config にもろもろの設定をしておけば、その設定を共有できるので、 ssh_config を使った方が便利だと思います。
(fabfile.py に全部情報を入れておきたいなどの場合は、別です。)

今回の宿題

今回の宿題は、

  ssh_configで、複数の設定を1つのHostで記述してみてください。

です。

Host の引数には、* や ? を含ませることができます。
(ちなみに、* は0以上の任意の文字、? は任意の1文字にマッチします。)

そして、IdentityFile の引数には、%h や %r, %l, %u などを含ませられます。 (それぞれリモートホスト名、リモートユーザ名、ローカルホスト名、 ローカルユーザ名です。)

というわけで、ほとんど答えを書いてしまっている気がしますが、 1つのHost と、それに付随する設定だけで、複数の設定を実現してください。

あとがき

みなさまはもうすでにご存じかもしれませんが、 ケーブルの正しい巻き方というのが話題になっているようです。

ケーブルの正しい巻き方(動画) << WIRED.jp
http://wired.jp/2013/08/13/tnhyut-coil-cable/

大学の研究室にいた頃、先輩に教わったのですが、 いつのまにか長い長いケーブルを扱わなくなってしまい、すっかり失念していました。

もし万が一、長いケーブルを巻く必然性にかられたときは、 こうやるんだとか若い人相手にウンチクをたれながら、実践したいと思います。

ちなみに、これ、水道のホースにも有効でしょうか。ですよね。
これこそ、身近にあるケーブルの一つだと思いますので、 正しい巻き方をする水道ホースを、どこぞやで商品化していただきたいと思います。

…ま、ここ数年、ホースを使った覚えがなかったりするのですが。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、9月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/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本