UNIXやLinuxの最近のブログ記事

どうせ無制限で sudo できる設定をするくらいなら、普通に su すればいいだけじゃん・・・と思うんだけど、世の中にはインターネットの情報だけでサーバ管理者になっちゃった人も多くて、そういう人が(ちゃんと理由も検証せず)「root になって作業するなんて危ない!sudo して作業するべき!!」とか小うるさいことを言うのよね。

"わかってる"人は「そんなの人それぞれ。好きなようにやりゃあいいんじゃないの」って言うけどね。特に自分が root のパスワードを知っている管理者ならね。
sudo なんて、本来は「準管理者」な人に「インストールだけは許す」とか、そういうゆるい制限をかけるためのもんでしょ?

とは言うものの、パパっとインストールしちゃいたい時は(セキュアだ、どうだ、という問題ではなく)sudo して済ましちゃった方が良い場合もある。

今まで sudo 設定をしてなかったサーバにも、とりあえず設定しちゃおう・・・という話。

$ sudo ls
[sudo] password for hoge:<hoge のパスワード入力>
hoge is not in the sudoers file.  This incident will be reported.

hoge ユーザは sudoers ファイルに設定がないので sudo 出来ない。
ディフォルト状態では、/etc/sudoers には root の設定しかされていないからな。

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

この設定ね。

ここに、hoge も追加してやればいい。

# ls -la /etc/sudoers
-r--r----- 1 root root 4002 Mar  2  2012 /etc/sudoers

ファイルはこのように、root ユーザでも書き込み出来ないパーミッションになっているが、w! して強制的に書き込めばいいので、俺は普通に vi で編集。

# vi /etc/sudoers

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
hoge    ALL=(ALL)       ALL ←追加

これで、

# exit
logout
$ sudo ls
[sudo] password for hoge:<hoge のパスワード入力>
api_test_data  code.dmp  systemmst.dmp  test  test.pl

こんな感じで hoge ユーザで sudo が可能となる。

ちなみに、「vi で sudoers を編集するの、怖いよ」というビビリのために visudo という vi ライクなエディタが用意されているが、どうしてこのエディタを使ったら安全なのかよくわからん。別に vi だろうが visudo だろうが、sudoers ファイルを編集するのは一緒だろ?
なんか、vi にはない良い機能があるの?"絶対"visudo を使うべき!派の意見を聞いてみたいね(笑)
Raspberry Pi3(Raspbian)で /var/log/mesages に、

Feb 13 12:59:39 host1 rsyslogd-2007: action 'action 17' suspended, next retry is Mon Feb 13 13:01:09 2017 [try http://www.rsyslog.com/e/2007 ]

というメッセージが出続けている。

これ、Raspbian jessie のベースとなった Debian jessie のバグらしい。


rsyslog.conf に、X Window System を立ち上げてなくても、/dev/xconsole に対してメッセージを出力しようとする設定が書かれているためのようだ。

なので、手っ取り早いのはこの設定をコメントにして無効にしてしまうこと。
コメントにしちゃうと、/dev/xconsole にエラーメッセージなども送られなくなっちゃうけど、わしら「X は日頃立ち上げてないけんね」というサーバ使いにとっては問題あるまい。

# cp /etc/rsyslog.conf /etc/rsyslog.conf_20170213
# vi /etc/rsyslog.conf
# diff /etc/rsyslog.conf /etc/rsyslog.conf_20170213
118,122c118,121
< # 2017/02/13 comments (debian bug)
< #daemon.*;mail.*;\
<       #news.err;\
<       #*.=debug;*.=info;\
<       #*.=notice;*.=warn      |/dev/xconsole
---
> daemon.*;mail.*;\
>       news.err;\
>       *.=debug;*.=info;\
>       *.=notice;*.=warn       |/dev/xconsole

このようにコメントにして、rsyslog の再起動。

# service rsyslog restart
# tail /var/log/messages
<略>
Feb 13 16:16:35 host1 rsyslogd-2007: action 'action 17' suspended, next retry is Mon Feb 13 16:18:05 2017 [try http://www.rsyslog.com/e/2007 ]
Feb 13 16:25:44 host1 rsyslogd-2007: action 'action 17' suspended, next retry is Mon Feb 13 16:27:14 2017 [try http://www.rsyslog.com/e/2007 ]
Feb 13 16:25:44 host1 rsyslogd: [origin software="rsyslogd" swVersion="8.4.2" x-pid="527" x-info="http://www.rsyslog.com"] exiting on signal 15.
Feb 13 16:25:45 host1 rsyslogd: [origin software="rsyslogd" swVersion="8.4.2" x-pid="16645" x-info="http://www.rsyslog.com"] start

この後、メッセージは出なくなったので OK なんじゃろね。

余談だが、Raspbian(ラズビアン)という OS の名前は「レズビアンみたいでいやらしい!」と思う性欲の強い方も中にはいらっしゃるでしょうが、これはベースになった Linux ディストリビューション Debian(デビアン)の名前を継承しているから。

ちなみに、Debian という名前は、最初にディストリビューションを立ち上げた Ian Ashley Murdock が、当時のガールフレンドの名前 Debra Lynn と自分の名前 Ian を組み合わせて Debian としたわけで、もちろんレズビアンもデロリアンも関係ないので気をつけてほしい(笑)
例えば、

http://www.exsample.com/cgi-bin/test.cgi

にアクセスすると、

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

のような、CGI プログラムのソースが表示されてしまう。

さて、今回は Debian 系のパッケージ、いわゆる APT パッケージの Apache 2.4 を入れてみた。
RedHat 系世界の住民の俺から見ると、頭がおかしいんじゃないか?と思うような Apache 設定ファイルの構成である。

てか、俺は Apache に関しては「ソースからインストール派」なので、RPM パッケージの Apache の設定ファイル群にもイラっとさせられるんだけどね(笑)
まあ、この辺は宗教問題なのでこれ以上の言及は控えておきましょう(笑)

CGI プログラムのソースが表示されてしまう件に話を戻す。

まず、VirtualHost 設定の該当部分。

/etc/apache2/sites-available/www.exsample.com.conf の中に、

    ScriptAlias /cgi-bin/ "/usr/local/share/apache/cgi-bin/"

    <Directory "/usr/local/share/apache/cgi-bin">
        AllowOverride All
        Options +ExecCGI

        AddHandler cgi-script .cgi .pl

        Require all granted
    </Directory>

という記述あり。

なんか、ScriptAlias と Handler/ExecCGI の設定が二重にされてますけど(^^;
まあ、ScriptAlias してるんだから +ExecCGI は不要だと思うけど、現行、これで問題なく動いているので、とりあえずこれで良しとする(笑)

で、実際に CGI module を読み込んでるんかいな?と確認してみると、

# apache2ctl -M
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_event_module (shared)
 negotiation_module (shared)
 setenvif_module (shared)
 status_module (shared)

ありり?cgi_module がロードされてませんねえ。

# ls -la /etc/apache2/mods-available/cgi.load
-rw-r--r-- 1 root root 58  7月  6  2016 /etc/apache2/mods-available/cgi.load

cgi.load というファイルはあるので、こいつのシンボリックリンクを /etc/apache2/mods-enabled の下に作ってやる。

ln コマンド使って手動でやればすぐだが、せっかくなので a2enmod コマンドを使ってみる。
これ、シンボリックリンクを作ってくれるだけのコマンドのようだ。こんなコマンドの使い方を覚えている暇があれば、さっさと手動でリンクしちゃった方が早いじゃんとか言いながら笑ってはいけない。Debian 信者からむっちゃこのコマンドの正当性を説明されるで(笑)

# ls -la /etc/apache2/mods-enabled/*cgi*
ls: /etc/apache2/mods-enabled/*cgi* にアクセスできません: そのようなファイルやディレクトリはありません
# a2enmod cgi.load
Your MPM seems to be threaded. Selecting cgid instead of cgi.
Enabling module cgid.
To activate the new configuration, you need to run:
  service apache2 restart
# ls -la /etc/apache2/mods-enabled/*cgi*
lrwxrwxrwx 1 root root 27  1月 18 17:31 /etc/apache2/mods-enabled/cgid.conf -> ../mods-available/cgid.conf
lrwxrwxrwx 1 root root 27  1月 18 17:31 /etc/apache2/mods-enabled/cgid.load -> ../mods-available/cgid.load

素晴らしい(笑)

しかし、俺は cgi モジュールをロードしたかったのに、なぜに cgid が???

cgid って、Perl とかの生エラーメッセージをログに吐いてくれないからいやなんよね。

ま、いっか(^^; 今度時間が出来たら対応しよう。

で、サーバ再起動。

# service apache2 restart

CGI モジュールも、

# apache2ctl -M|grep cgi
 cgid_module (shared)

無事ロードされたね。

これで、

http://www.exsample.com/cgi-bin/test.cgi

にアクセスすると、

Hello, World

と表示されるようになる。

どう?RedHat 系世界の住民の皆さん。気持ち悪いでしょ?(笑)
若干のトラブルはあったものの(^^;、新しい OS イメージの展開に成功したので、それを Raspberry Pi の起動ディスク(SDHC カード)に焼き付ける。

今、俺んちにあるマシンで SD カードが刺さるのって MacBook Pro だけなので(Windows 機のメモリカード I/F 全部壊れてもうた。なんでじゃろ?(^^;)、作業は OS X のシェル上で行なう。

まず、MacBook Pro に SD カードを刺す。今回は、I-O データ製の 32GB SDHC カードを使用。

シェル上でカードが認識されていることを確認。
(ちなみにワシ、sudo じゃなくて root で作業する派なので悪しからず(sudo 派、うるせえからなあ(^^;))

# diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS osx                     499.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *24.1 MB    disk1
   1:        Apple_partition_map                         32.3 KB    disk1s1
   2:                  Apple_HFS PX504A_JPN_OSX_3783_41B 24.0 MB    disk1s2
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *30.9 GB    disk2
   1:             Windows_FAT_32 NO NAME                 30.9 GB    disk2s1
/dev/disk3
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *4.4 GB     disk3
   1:             Windows_FAT_32 boot                    66.1 MB    disk3s1
   2:                      Linux                         4.3 GB     disk3s2

disk2 として認識されているのがわかる。

これ、そのまま dd コマンドでイメージを焼き付けようとすると、

# dd bs=1m if=/Users/shinoda/2016-11-25-raspbian-jessie.img of=/dev/disk2
dd: /dev/disk2: Resource busy

という具合に Resource busy になっちゃうので、File System から SD カードを一旦 unmount する。
カードそのものではなく、論理ディスクだけをね。

# diskutil umount /dev/disk2s1
Volume NO NAME on disk2s1 unmounted

そして、dd コマンドでディスクイメージを焼き付け。

# dd bs=1m if=/Users/shinoda/2016-11-25-raspbian-jessie.img of=/dev/disk2
4169+0 records in
4169+0 records out
4371513344 bytes transferred in 2087.134050 secs (2094505 bytes/sec)

結構時間がかかる。
うちの(8年前に購入した)MacBook Pro のシェル上だと30分くらいかかった。

20170103_raspberry.JPG
もう一度 diskutil list コマンドで確認すれば、SD カードが Linux の boot ディスクになっているのがわかる。
書き込みは成功。

/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *30.9 GB    disk2
   1:             Windows_FAT_32 boot                    66.1 MB    disk2s1
   2:                      Linux                         4.3 GB     disk2s2

正常に書き込みが終了したら、SD カードそのものを unmount する。

# diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful

MacBook Pro から SD カードを抜いて Raspberry Pi に刺し、電源を入れれば Raspbian が起動するぞ。
20170101_raspberrypi1.JPG
事務所のサーバを、でっかい DELL のタワー型サーバから Raspberry Pi 3 に置き換えようと思ってる。
Raspberry Pi 3 は年末の Amazon で買ったら、急ぎ配送で元旦に届いた(笑)
ええと、Amazon 配送による運送屋さんの作業過多が社会問題になってましたが、ごめんなさい。俺のような客がいるからですね。正月の配達、ありがとうございました(^^;

まあ、それはそれとして(^^;

さっそく、最新の OS(RASPBIAN JESSIE WITH PIXEL Kernel 4.4)を、


から「Download ZIP」ボタンクリックで落としてきた。

2016-11-25-raspbian-jessie.zip

これを Mac OS X 標準のアーカイバーで解凍すると、

2016-11-25-raspbian-jessie.zip.cpgz

という、なんか知らない拡張子のファイルに・・・ img ファイルにならない。
いきなり作業中断。こんなところで悩むことになるとは思っていなかった(^^;

結局、StuffIt Expander で解凍したら問題なく

2016-11-25-raspbian-jessie.img

に解凍された。

ググってみると「バージョンの古いStuffIt Expander(ver 8.0.2)で解凍しないとだめだった」という情報もあったんだけど、うちは 15.0.7a という新しい(どの程度新しいものなのか不明なのだが)バージョンで OK だった。
なんか、cpgz になるにも色々なパターンがあるみたいやなあ。「拡張子が zip なのに、中身はテキストファイルだった」とか「古いアーカイバソフトで圧縮したため」とか、原因も色々あるみたいなんで、解決策も色々ってことだろうな。

ま、これで先に進めます(笑)
IIJ GIO ホスティングパッケージで提供されているサーバが 2台あって、仮に A.exsample.com と B.exsample.com とする。
この 2台の保守を依頼されたんだけど、なんか、A の時刻は合ってるのに、B の方は 8分ほどずれている。

どちらのサーバにも ntpd は入ってないようなので、IIJ のマニュアルを調べてみると「IIJ GIOホスティングパッケージのCentOS5は、初期状態ではXenの機能を使用してハイパーバイザと時刻を同期するように設定されています。」と。
確かに、A の方が CentOS 5 で、B の方が CentOS 6 のようだ。

試しに、A の方で確認してみると、

# /sbin/sysctl -n xen.independent_wallclock
0

と、ハイパーバイザとの時刻同期が有効な状態にあるという結果が返ってくる。("1"だと無効)

B の方で確認すると、

# /sbin/sysctl -n xen.independent_wallclock
error: "xen.independent_wallclock" is an unknown key

となる。

CentOS 6 環境も Xen 上で提供されていると思うんだけど、こっちは端からハイパーバイザとの時刻同期とはなっていないようですなあ。

ということで、Xen はよく知らないので、手っ取り早く NTP(Network Time Protocol)で時刻同期を行うことにする。

まず、yum を使ってパッケージのインストール。

# yum -y install ntp

ntp-4.2.6p5-10.el6.centos.1.x86_64 がインストールされる。

自動実行ファイルなんかも入ってるね。

# ls -la /etc/rc.d/init.d/ntp*
-rwxr-xr-x 1 root root 1923 May  4  2016 /etc/rc.d/init.d/ntpd
-rwxr-xr-x 1 root root 2043 May  4  2016 /etc/rc.d/init.d/ntpdate

まず、NTP はあまりに時間がかけ離れていると同期に時間がかかるので(って、最近もそうなん?以前はそうだった。あ、20年くらい前の話ね(笑))、ある程度手動で時刻を合わせておこう。

# date
Thu Dec  8 11:45:02 JST 2016
# date -s "12/08 11:53 2016"
Thu Dec  8 11:53:00 JST 2016

8分遅れていたので調整。

# date
Thu Dec  8 11:53:05 JST 2016

ちゃんと時刻が変更されている。
実際の時間とは数十秒ずれているだろうが、ここで ntpdate の実行。

# date
Thu Dec  8 11:55:27 JST 2016
# ntpdate ntp00.iij.net
 8 Dec 11:55:49 ntpdate[9221]: step time server 210.130.188.10 offset 21.042093 sec
# date
Thu Dec  8 11:55:53 JST 2016

21秒ほどあった差が修正された。
あとは、自動的に同期が行われるよう、ntpdデーモンを起動しておく。

まず、/etc/ntp.conf の上位サーバを変更。
上位サーバには全て IIJ が提供しているものを選んだ。

# cp /etc/ntp.conf /etc/ntp.conf_20161208
# vi /etc/ntp.conf
# diff /etc/ntp.conf /etc/ntp.conf_20161208
22,28c22,25
< #server 0.centos.pool.ntp.org iburst
< #server 1.centos.pool.ntp.org iburst
< #server 2.centos.pool.ntp.org iburst
< #server 3.centos.pool.ntp.org iburst
< server ntp00.iij.net
< server ntp01.iij.net
< server ntp02.iij.net
---
> server 0.centos.pool.ntp.org iburst
> server 1.centos.pool.ntp.org iburst
> server 2.centos.pool.ntp.org iburst
> server 3.centos.pool.ntp.org iburst

自動起動の設定を忘れないうちにやっておこう。

# chkconfig --list ntpd
ntpd            0:off   1:off   2:off   3:off   4:off   5:off   6:off
# chkconfig ntpd on
# chkconfig --list ntpd
ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

で、デーモン起動。

# service ntpd start
Starting ntpd:                                             [  OK  ]

同期状況確認。

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp00.IIJ.Net   210.130.188.1    3 u    6   64    1    1.108    0.055   0.002
 ntp01.IIJ.Net   210.130.188.1    3 u    6   64    1    1.481    0.266   0.002
 ntp02.IIJ.Net   210.130.188.1    3 u    5   64    1    1.063    0.068   0.002

さすが、同じ社内の NTP サーバ。同期が早い。起動したとたんに同期したで。
あ、さっき手動で ntpdate コマンド実行したからか(^^;

左に * がついている ntp00.IIJ.Net が、時刻同期している上位NTPサーバ。

もう一回実行してみる。

# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp00.IIJ.Net   210.130.188.1    3 u   25   64    7    1.114    2.955   2.291
+ntp01.IIJ.Net   210.130.188.1    3 u   29   64    7    1.488    3.068   2.217
+ntp02.IIJ.Net   210.130.188.1    3 u   28   64    7    1.130    2.903   2.255

ntp01.IIJ.Net や ntp02.IIJ.Net の横に + マークがついたけど、これは「同期候補にあがっている」サーバだということ。
例えば現在同期サーバである ntp00.IIJ.Net に何かあった場合は(多分、反応に時間がかかってるとか)、この + マークが付いているサーバが同期に使われる。

ばっちりやね。
いやあ、まあ、今時?な話なんで、こんなところに書いてもあんまり参考になりませんが、俺の備忘録代わりに。

もうずっと(サーバは乗り換えつつも基本的な環境は変更せず)動いてるシステムがあって、そのメールサーバが、tcpserver(ucspi-tcp)+qmail という形で構築されている。

今回、このメールサーバを某プロバイダのロードバランサー(以降 LB)の下に移動することになった。
MX にロードバランサーの IP を指定して、外部からのメールは LB の 25番ポートに届くんで、それをネットワーク内部にいるメールサーバの 25番に振り分ける・・・っていう運用ね。

これが上手くいかないの(^^;

/etc/tcp.smtp には LB の IP も登録し、実際、/var/log/messages を見ると、LB からメールサーバの 25番ポートには接続に来ている。
実際、メールサーバ側の /usr/local/bin/tcpserver も起動するしね。
しかし、送り元に 220 コード(正常に接続できたという意味のコードNo)は返ってこない。

$ telnet smtp.exsample.co.jp 25
Trying 202.XXX.XXX.116...
Connected to smtp.exsample.co.jp.
Escape character is '^]'.
Connection closed by foreign host.

と切れちゃう。

正常に接続できれば、

$ telnet smtp.exsample.co.jp 25
Trying 202.XXX.XXX.116...
Connected to smtp.exsample.co.jp.
Escape character is '^]'.
220 smtp.exsample.co.jp ESMTP
QUIT
221 smtp.exsample.co.jp
Connection closed by foreign host.

と、こんな感じなんだけど。

なんじゃあ???
送った側の /var/log/maillog 見てみると、

Nov 22 16:02:12 smtp qmail: 1479798132.340284 delivery 1015263: deferral: Connected_to_202.XX.XX.116_but_connection_died._(#4.4.2)/

だって。
接続後数秒してから切れるので、タイムアウトくさい。tcpserver が答えを返さない?あるいは tcpserver が必要としている情報が LB から来ない?(直接インターネットから接続すると上手くいくので、LB 独自の何か・・・なんだろうけど)

結論から言うと、tcpserver が TCPREMOTEINFO を取得しようとするが、LB からは取得できず待ちにはいっちゃって、LB側がセッションを切ってる感じかな?
LB 側のセッション切れた後も、しばらく tcpserver は起動しているからそういうこと?

結局、tcpserver の起動オプションに「接続元ホストから $TCPREMOTEINFO を取得しない」という意味の R をつければよかった。

/usr/local/bin/tcpserver -v -u ~(以下略)
 ↓
/usr/local/bin/tcpserver -vR -u ~(以下略)

という感じ。

これで、問題なく LB 経由で内部のメールサーバにメールが届くようになった。
今、朝 3:38 ですね。

朝の 6時には起きて出勤の準備をして、7時には車で家を出ます。もう、寝なきゃ。でも、備忘録にまとめとかなきゃ。

いやあ、CentOS 上の lha のセットアップでハマりました・・・

いや、今更 lha を使うのはどうなの?という話は取り敢えず置いておいて。
「システム的に(まあ、スケジュール的な問題が大きいんだけど)別のアーカイバへの変更は難しい。」「一般公開していないクローズドなシステム上で使用するのでセキュリティ等の問題も特になし」という条件のもとで使用しているので。

サーバ更改を行うので(CentOS 4.9 → CentOS 6.7)、新しい CentOS 6.7 サーバに lha を入れてたんだけど・・・

標準のリポジトリには lha は存在していないので(まあ、そうだろうな)Repoforge(RPMforge)リポジトリを使って yum インストールしたんだけど、バージョン 1.14g のものが入った。

でも、このバージョン、どうもよくない。

プログラムの中で、

lha e -e -i -w=展開先ディレクトリ 解凍するLZHファイル

という形でコマンドを投げてるんだけど、これがエラーになる。
シェル上で手動で実行してみると、「LHa: Fatal error: -e: No such file or directory」というエラーになる。
どうも、コマンドとオプションの設定の仕方が違うようだ。

結局、

lha -eeiw=展開先ディレクトリ 解凍するLZHファイル

のようにコマンド&オプションを全部つなげてやればエラーは出ずに展開されるんだけど、展開されたファイル名がバケバケなのだ。

というのが、解凍を行う LZH ファイルの中の各ファイルには日本語ファイル名がついているんだけど、それを一旦 EUC-JP に変換してやらないとプログラム的に色々まずいんだが、どうも Shift_JIS のまま出力されているような・・・
e というのが解凍コマンドで、その後ろの -e というオプションが「ファイル名を EUC-JP に変換する」というものなんだけど、これが効いてないなあ・・・

なんか、このバージョン、全てにおいて駄目駄目。

ということで、結局、


からソースを取ってきて手動で make した。

このバージョンが 1.14i-ac20050924p1 で、これは CentOS 4.9 に入ってたのと同じバージョンだな。
プログラムもエラーを出さずに動くようになった。

まったく、lha なんていう死んでいったソフトがらみでこんなに手間取るなんて・・・

ああ・・・4:00になった・・・2時間しか睡眠時間がない・・・
MacBook Pro を買った 5年前には、OS X で動く SFTP クライアントにパッとしたのがなかったので(まあ、十分探したともいえないけど)、どうしても SFTP で接続する必要がある時は VMware で Windows 7 を開いて WinSCP を使っていた。
面倒臭いけど、その頃はほとんどのサイトが FTP で接続できたからな。わざわざ SFTP にしないといけないサイトが少なかったから何とかなっていたのだ。

しかーし、最近は SFTP でしかつながらないサイトが増えた・・・というか、テスト用に立てたサーバなんかいちいち FTP サーバを入れるのが面倒臭いので、ほとんどが SFTP オンリーだ(^^;

ということで、Mac にも SFTP クライアントを入れることにした。
選んだのは FileZilla。
ざっと使ってみた感じでは、日本語のファイル名(ディレクトリ名)も問題なく表示されるし、FFFTP や WinSCP と画面も似てて違和感がなくていいね。

ただ、インストール時に、あの評判の悪い MacKeeper のインストールを促すのはいただけない。
このインストール料で開発費を賄っているのかもしれないから、そりゃあ協力してあげたいけど、あんま良い評判聞かないからなあ。McAfee と一緒で(笑)

ちなみに、ちゃんとインストールをして MacKeeper を評価されている方の記事がこちら。

参考まで。
CentOS サーバ(CentOS 6.5 + OpenSSH 5.3p1 という環境)で、特定ユーザの SFTP 接続を chroot させるための設定のメモ。

今回、FTP サーバを立ち上げていないサーバに、外注の Web デザイナーさんにデータのアップロードをしてもらうことになった。そのためだけに FTP サーバをセットアップするのもなあ・・・ということで、SFTP で接続してもらうことにした。となると、SFTP 接続してきた特定のユーザだけ chroot するよう設定が必要だよね。
つまり、そのユーザは自分がデータをアップロードするディレクトリから、他の上位ディレクトリには移動できなくする・・・というわけね。

もちろん当社に協力していただいているデザイナーさんに、よそのディレクトリに移動して大事なデータを盗み見たりするような人はいませんが、念の為にね(笑)

1.データアップロード用のディレクトリ作成(root で)
 (例)mkdir -p /var/hosts/www.exsample.jp
    ※ /var/hosts/www.exsample.jp の所有者は root であること!

2.chroot するユーザの作成
 (例)useradd -g 7000 -s /sbin/nologin -u 7001 -d /var/hosts/www.exsample.jp webusr01
 ※パスワードも忘れずに!

3.chroot 先のディレクトリに、webusr01 で触れる子ディレクトリを作っておく。
 (上の例では、/var/hosts/www.exsample.jp 自体は root ユーザのものなので、webusr01 ではファイルを書き込んだりできない)
 (例)
 mkdir /var/hosts/www.exsample.jp/www
 chown webusr01 /var/hosts/www.exsample.jp/www

3.sshd の設定変更
 上の例の webusr01 のように、頭に web と付くユーザだけ chroot することにする
 /etc/ssh/sshd_config の一番下に、以下の設定を追加。

# override default of no subsystems
#Subsystem       sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp

Match User web*
  ChrootDirectory ~

 ※最初に書かれていた Subsystem の行はコメントにする。

4.sshd の再起動
 (例)service sshd restart

これで、頭に web とついたユーザは chroot されるようになる。

ちなみに、色々ググりながら設定したんだけど、ForceCommand で実行プログラムを指定すれば Subsystem の設定を上書くので、Subsystems の設定行を直接変更することはないでぇ!つまり、

# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server

Match User web*
  ChrootDirectory ~
  ForceCommand internal-sftp

こういう設定でいけるはずやでぇ!と書かれているサイトがあったんだけど、うちの環境では、

error: subsystem: cannot stat /usr/libexec/openssh/sftp-server: No such file or directory
subsystem request for sftp failed, subsystem not found

というエラーになったで。(ForceCommand はちゃんと書いてたけど)
chroot 先には /usr/libexec/openssh/sftp-server は無いから当然 "No such file or directory" になるわけで。

結局、手順例に書いたように、

#Subsystem       sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp

としなきゃダメだったな。うーん・・・

あ、もしかして、webusr01 のログインシェルに /sbin/nologin を設定してるから???

まあ、とりあえず望んでた動きにはなっているのでこのまま行くけど・・・

このアーカイブについて

このページには、過去に書かれたブログ記事のうちUNIXやLinuxカテゴリに属しているものが含まれています。

前のカテゴリはMacです。

次のカテゴリはWindowsです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら