「ssh」タグアーカイブ

scpでIDとパスワードを自動入力させる方法(expect)。

expectを利用して、sshやscpにおけるIDとパスワードを自動入力させる方法は、いろいろなサイトで公開されています。

今回、この記事を記載した理由は「password:」で止まってしまう現象が発生しました。
多くのサイトで記載されている方法では、この「password:」で止まってしまう現象を回避出来なかったため、その方法を記載します。

実際に使用したコマンドは以下の通りです。

# expect -c "spawn scp a.txt user@127.0.0.1:/home/user ; expect password: ; send passwd\r ; expect $ ; exit"

a.txtファイルを127.0.0.1のサーバ(今回は自分自身のサーバ)にあるuserというユーザの/home/userディレクトへコピーしています。

パスワードは「passwd」なのですが、その後ろに「\r」を追加することが肝でした。

これにたどり着くまでが長かった。。。(^^ゞ

でもこれで問題なく解決しました。

環境によって、この「\r」が必要ではない場合もあると思いますが、一応これも方法の一つと考えていただければ幸いです。

一般ユーザにホームディレクトリ以外を見せなくする。

表題があまり正確ではないので、正確に。

Linux(CentOS 6.x)ですが、sshでログインしたユーザが/を見えたりする状態って嬉しくない時があります。

そういう時に、自分のホームディレクトリ以下のフォルダーやファイル以外を見えなくしてしまおうというのが今回の説明です。

本当は、sshでrootにログイン出来なくした上で、他のユーザからsu -でrootにスイッチしたいと考えました。
その時、他のユーザにおいてホームディレクトリ以下しか見えない設定にしたかったのですが、思うように出来なさそうなので・・・諦めました。

なので、実のところ副産物に過ぎず、あまり問題も気にせず、一応出来たよ・・・ということで書きますね。

まず、前回sshでrootアカウントのログインを出来なくしました。
その続きで見ている人がいたら要注意です。
これから作成するユーザをrootの代わりに作ったユーザIDには設定しないでください。
これから作成するユーザはsu コマンドを利用してrootにスイッチすることは出来ません。

あまり利用される機会は少ないと思いますが・・・

順序を説明します。

まず、新たにユーザを作成します。

# adduser abc
# passwd abc
Changing password for user abc.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
#

一応、フォルダーも作成されて.bashrcなんかも入れてくれています。
useraddコマンドで作成するとちょっと違った感じになっちゃいますので、必ずadduserコマンドで作成してください。

出来上がったホームディレクトを確認します。

# l
total 48
drwxr-xr-x 12 root       root       4096 Jan 15 20:24 .
drwxr-xr-x 21 root       root       4096 Nov 26 17:01 ..
drwx------  8 abc        abc        4096 Jan 15 20:29 abc

chrootするだけなら、この時点で特に設定を変更する必要はないのですが、最終目的はsshでログインまでさせることを考えているので、ここで設定を少し変更します。

理由は、sshでログインして移動させることが出来るディレクトリはroot権限になっている必要があるようです。
更に、オーナーをrootにしてしまうと、パーミッションを変えてやらないと一般ユーザが何も出来ない状態になってしまうからです。

では先程作ったabcユーザのフォルダーに対し設定変更を行います。

# chown root:root abc
# chmod 755 abc

ここから必要最小限のファイルをコピーします。
と言いながら、面倒なのでがっつりと(^^ゞ

# cd /home/abc
# cp -p -r /bin /home/abc/bin
# cp -p -r /dev /home/abc/dev
# cp -p -r /etc /home/abc/etc
# cp -p -r /lib /home/abc/lib
# cp -p -r /lib64 /home/abc/lib64
# mkdir usr
# cp -p -r /usr/bin /home/abc/usr/bin

これで、chroot出来る環境が整ったはずです。
確認します。

# chroot /home/abc
bash-4.1#

これで成功です。

CTRL+Dで一度抜けます。

ここから、今度は作成したユーザ(abc)にsshでログインします。

# ssh abc@domain
abc@domain's password:
[abc@domain ~]$

入れることを確認したら、これも一旦抜けます。
このままでは、cd ..とすると/homeへ移動できてしまうはずです

sshdの設定を変更します。sshd_configファイルに以下の設定を追加します。最後に追加すれば良いはずです。

# vi /etc/ssh/ssd_config
<<省略 以下は最後に追加>>
Match User abc
        X11Forwarding no
        AllowTcpForwarding no
        ChrootDirectory /home/abc

sshdの設定を再読み込みします。

# service sshd reload
Reloading sshd:                                            [  OK  ]
# service sshd status
openssh-daemon (pid  16192) is running...
#

こんな感じになっていればOKです。

仕上げの確認です。

# ssh abc@domein
abc@domein's password:
-bash-4.1$ pwd
/
-bash-4.1$ cd ..
-bash-4.1$ pwd
/
-bash-4.1$

cd ..で上位のディレクトリへ移動しようとしても移動できていないことが判ると思います。

設定は以上なのですが・・・ここで問題です。

-bash-4.1$ touch aaaa
touch: cannot touch `aaaa': Permission denied
-bash-4.1$

そうです。ファイルを作ることが出来ないんです!

入れるけど、何も作成することが出来ない状態なのです。

そこで、ファイルが作れる環境を準備します。

何度も済みませんが、また抜けてください。
root権限で作業を行う必要があります。

rootアカウントに戻ったら、以下の操作を行います。
作成するディレクトリは任意の名称で構いません。

# cd abc
# mkdir user_space
# chown abc:abc user_space
# su - abc
$ cd user_space/
$ touch aaa
$

これで、/home/abc/user_spaceでabcユーザが自由に使えるスペースが出来ました。

先程と同じようにsshでログインしても大丈夫です。

今回この資料を残したのは、chrootで以下のエラーが発生したためです。

chroot: failed to run command `/bin/bash': No such file or directory

この問題を解決する方法が他のサイトにも記載されてはいたのですが、私が調べたサイトでコピーしているフォルダーの内容などをチェックしても失敗してしまったので、それらしきフォルダーをコピーして動くようにした経緯を残したかったからです。

誰かの参考になるかな?
正直、あまり使い道が無い結果になっているのですが・・・

私の最終目的は、ここからsu コマンドでrootユーザにスイッチ出来るところまでだったのですが、それには/etc/passwdをコピーするなど、本来隠しておきたいファイルが公になってしまうことが解りました。
まあ、それでも良かったのかも知れませんが・・・取りあえず、この段階でやる気が尽きましたのでご勘弁ください。

どなたかフォローのコメントを頂ければ幸いです。

P.S.ほとんど見られていないだろうから、コメント無いよな~寂しいなぁ~(8_8)

 

 

rootのssh接続を禁止する。

CentOS 6.Xにおいて、rootでssh接続が出来なくするための設定です。

デフォルトで接続できなくなっている環境もあるかと思いますが、今回は自分で設定します。

必ず、別途のユーザでssh接続できる状態にしておかなければいけません!!

ユーザの追加などはuseraddコマンドを使うなりなんなりとw

さて、簡単です。

sshdの設定ファイルを開きます。

# vi /etc/ssh/sshd_config

ファイルの中身はこんな感じ
(セキュリティの関係で、説明に必要が無い部分は省略しています。)

#       $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options change a
# default value.

Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

<<中略>>

# Authentication:

#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

<<以下省略>>

ついでになりますが、sshポートをデフォルト状態にしておくと外部からの攻撃の的になりやすいです。

そこで、ポート番号を別のポートに変更します。
例えば、51222とか任意のポートを指定します。
このポートで接続できることも確認しておきたいですね。

さらに23行目をコピーして以下の様に設定します。

#PermitRootLogin yes
PermitRootLogin no

最後にsshdのサービスで設定を再読み込みします。

# service sshd reload

敢えて、再起動(restart)はしませんでした。

理由は、reloadだと既に接続されている状態が維持されるからです。

この時点でssh接続を行っていた状態は維持されているはずです。

別途、他のssh端末を開いて上記で行った設定を元に接続を行ってみてください。(ポート番号の指定を忘れない様に)

rootへのssh接続が出来ないこと。
ポート番号が任意の指定した番号に変更になり、デフォルトの22ポートでは接続出来なくなっていることを確認してください。

これで、sshポートに対する不正アクセスは大幅に削減できるはずです。

そもそもICMP(PING)を禁止しておくべきなのですが、pingを死活監視に使いたかったので、ファイアウォールで禁止にしました。
サーバ自身はpingに応答出来る様にして、死活監視が可能な状態が欲しかったのです。

ファイアウォールが提供されていない環境では、インターネットからの不正アクセスを軽減する(禁止にはならない)ために、iptablesなどを使ってICMPを拒否することが望ましいと思います。
私の様にそれでも死活監視などの理由で残したい方は、特定のIPからのみ許可するなどの対策をご検討下さい。