Tag Archives: ssh

SSH接続ユーザの強制ログアウト方法

ずっとログインしたままのユーザが居ると聞いてwコマンドで確認。
fオプションは接続元IPを非表示にします。これは最初から接続元が分かっているのであれば不要なのと実行中のコマンド内容が右端で切れてしまうのでそれを防ぐためにつけています。
実験的にVMのCentOS6.4で試してみました。

[root@CentOS64 ~]# w -f
08:40:57 up 15 min, 3 users, load average: 0.00, 0.03, 0.08
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 08:40 0.00s 0.05s 0.03s w -f
user1 pts/1 26Nov13 21days 0.01s 0.01s -bash
user2 pts/2 26Nov13 21days 0.01s 0.01s -bash

2人のユーザがログインしたまま放置されていました。全くけしからん。
次にpsコマンドの結果からsshdを抽出し対象のプロセスIDを調べます。

[root@CentOS64 ~]# ps ax | grep sshd
1093 ? Ss 0:00 /usr/sbin/sshd
1252 ? Ss 0:00 sshd: user1 [priv]
1256 ? S 0:00 sshd: user1@pts/1
1272 ? Ss 0:00 sshd: user2 [priv]
1276 ? S 0:00 sshd: user2@pts/2
1349 ? Ss 0:00 sshd: root@pts/0
1368 pts/0 S+ 0:00 grep sshd

ここで見るのはptsとついた行になります。
もっと絞り込めば、こんな感じでしょうか。

[root@CentOS64 ~]# ps ax | grep "sshd: .*@pts/"
1256 ? S 0:00 sshd: user1@pts/1
1276 ? S 0:00 sshd: user2@pts/2
1349 ? Ss 0:00 sshd: root@pts/0
1393 pts/0 S+ 0:00 grep sshd: .*@pts/

こうすれば対象のプロセスIDが1256と1276であることが分かります。

それでは殺しましょうw

[root@CentOS64 ~]# kill 1256
[root@CentOS64 ~]# kill 1276

これでログインしたままのユーザを強制排除できました。さっそく確認しましょう。

[root@CentOS64 ~]# ps ax | grep "sshd: .*@pts/"
1349 ? Ss 0:00 sshd: root@pts/0
1395 pts/0 S+ 0:00 grep sshd: .*@pts/

ね、生きていないですねw

用法は
・メンテしたいのでユーザに出て行って欲しい時
・不審な接続の排除
・通信切れ等で残ったゴミ接続の掃除
となります。

因みにユーザ権限では他のユーザを追い出すことは出来ませんのでご心配なく。

ポートフォワードを使って踏み台先のサーバにFileZillaでファイル送受信する

WinSCPはトンネルの設定があり単体で踏み台経由の接続ができますが、残念な事にこのツールがWindows版しか無い為、他のOSでは別の方法をとる必要があります。

その一例としてsshコマンドによるポートフォワードを使った接続を紹介します。

1.ターミナルを立ちあげてポートフォワードを行う

ssh -L <ローカルポート>:<転送先ホスト>:<転送先ポート> <踏み台ホスト>

ローカルポート:FileZillaに設定したいポート番号
転送先ホスト:踏み台からアクセスするサーバー
転送先ポート:踏み台からアクセス先のサーバーへ接続するポート

例えば普段SSHで以下のように接続する場合

ssh user1@172.16.33.43 (踏み台)
ssh user2@192.168.1.6 (転送先)

割り当てるローカルポート番号を10022とすると
ssh -L 10022:192.168.1.6:22 user1@172.16.33.43 -p 22

この状態でlocalhost:10022は172.16.33.43経由で192.168.1.6:22に接続される。
注意点としては上記コマンドを実行して172.16.33.43にログインした後は、FileZillaの作業が終わるまで閉じないこと。

2.FileZilla で接続する。
ホスト名に localhost、ポートに 設定したポート番号、ユーザ名はuser2
(上記の例で行くと 10022 を設定する)

サーバのIPアドレス入れ換えた時のSSH再接続

 サーバーのIPアドレスを入れ換えるなんて普段は無いのですが、ハードウェア障害によるサーバ交換を行った時に気をつけなければならないのはSSHが弾かれてしまうこと。
Windowsクライアントならサーバが代わろうが警告が出ようが新しいキーを上書きして続行できるのですがLinux同士だと、一旦known_hostsの情報を削除する必要がありました。
で、これだけknown_hosts自体を削除しそうですが、SSHの接続先が複数あるときは後でknown_hostsを再生成する手間が掛かるので、該当行だけを削除します。
viでdd打てばそれで終わりですが、もっと安全な方法が無いかと探したらありました。
参考:
OpenSSH : WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

http://futuremix.org/2007/08/openssh-warning

ssh-keygen -F [IPアドレス]
で検索して
ssh-keygen -R [IPアドレス]
で削除
これは簡単。

sshでnfsっぽい事ができるsshfs

これは使えるかも。UNIX同士でファイル共有するのは私の周りではサーバー間のコンテンツ共有(Apacheは分散するけどユーザコンテンツは一箇所にするとかの場合)にnfs使ったりしていますが、これが後で負荷が増えたからという理由でウェブサーバー追加しても、データセンター上で別ラックになってLANは無理ですなんて事もある。そういうときの最終手段として暗号化nfsはいいかも。

sshでリモートサーバーをマウント、便利にsshfs – Unix的なアレ
http://d.hatena.ne.jp/wadap/20080603/1212506793

SSH接続の効率化

この前からTeraTermMenuの古い日本語版をカスタマイズしてコンパイルし使っていましたが、UTF版TeraTermには英語版の最新TeraTerm Menuが入ってました。それだけなら特に他の方法でやってみようという気にならなかったのですが、多段ログインのマクロを組んでいるときにヘルプを見たら…。普通にマクロの拡張子をTeraTermMacroに登録して利用できるようです。つまりマクロファイルダブルクリックでOKということなのでこれをスタートメニューとかクイック起動バーに登録すればTeraTermMenuは使わなくても良かったということです。

まずはwheelグループに属しているユーザでログインしsuでルートになる方法
username = ‘username’
hostname = ‘192.168.100.100’
password = ‘userpassword’
supass = ‘supassword’
ini = ‘black_euc.ini’
timeout = 30
msg = hostname
strconcat msg ‘:22 /ssh /auth=password ‘
strconcat msg ‘/user=’
strconcat msg username
strconcat msg ‘ /passwd=’
strconcat msg password
strconcat msg ‘ /f=’
strconcat msg ini
connect msg
pause 2
sendln ‘su -‘
wait ‘Password:’
sendln supass

iniの項目でカスタマイズしたiniファイルを定義します。これはサーバーによって扱っているロケールの文字コードが違う為文字コード別にiniファイルを作成しています。あとはDevelop/Staging/Publicで背景色と文字色を変えてサーバの取り違いミスを予防します。接続の後のpauseはサーバーの応答を待たずにsuコマンドを発行しないようにマクロ側を一時停止します。その後のwaitはサーバーからの応答を待ってパスワードを送信します。timeoutはwait用の値です。

上記はパスワード認証用ですが、次は公開鍵を使って1台目のサーバに接続しさらに他のサーバへsshへログインする方法です。(これはグローバルIPを持たないデータベース専用サーバ等でよく利用します)

username = ‘username’
hostname = ‘192.168.100.100’
password = ‘userpass’
key = ‘id_rsa’
rlhost = ‘192.168.100.101’
rluser = ‘rluser’
rlpass = ‘rlpass’
ini = ‘black_euc.ini’
msg = hostname
strconcat msg ‘:22 /ssh /auth=publickey ‘
strconcat msg ‘/user=’
strconcat msg username
strconcat msg ‘ /passwd=’
strconcat msg password
strconcat msg ‘ /keyfile=’
strconcat msg key
strconcat msg ‘ /f=’
strconcat msg ini
connect msg
pause 2

msg = ‘ssh -l ‘
strconcat msg rluser
strconcat msg ‘ ‘
strconcat msg rlhost
sendln msg
wait ‘Password:’
sendln rlpass

そして作成したマクロファイルをダブルクリックで起動できるように定義します。

WindowsXPでの登録方法
1.エクスプローラーの[ツール(T)]-[フォルダ オプション(O)]からファイルの種類タブをクリック。
2.[新規(N)]をクリック。
3.ファイル拡張子(F)の欄に「.ttl」と入力して[OK]をクリック
4.TTLファイルが登録されたら、「拡張子’TTL’の詳細」グループ内の[詳細設定(V)]ボタンをクリック。
5.一番上のテキスト入力は拡張子の種類に入る説明なので「Tera Term macro files
」と入力。
6.[アイコンの変更(I)]をクリックして好きなアイコンを選択。TeraTerm系のアイコンにしたい場合は[参照(B)]よりTeraTermのインストールされているフォルダへ参照しTeraterm実行ファイルの中から選択する。
7.[新規(N)]をクリックしアクションに「接続」と入力。実行するアプリーションは[参照(R)]でTeraTermマクロ実行ファイルを選択。この時%1が追加で挿入されるがダブルクォートで囲んで[OK]をクリック。
例) “C:Program Filesteratermttermpro.exe” “%1”
8.ついでに[新規(N)]でもうひとつ登録。アクションは「編集」でアプリケーションはTTLEditを選択する。
9.既定は「接続」になっていることを確認して[OK]をクリック。最後に[閉じる]をクリックして終了。

TTLEditはTeraTermマクロに特化したエディタで色分けもされているのでとても便利です。

 

SSHのクライアント認証

持ち歩くFreeBSDクライアントの方は一応DHCPと固定IPの複合で使えるようにしたので、他のPCからもSSHログインできるようにします。

この場合、接続場所によってサブネットが変わるのでIPフィルタでは大変です。それでクライアント認証を使い、ログインできる端末を制限します。

[Windowsで鍵生成]
Windows側で鍵を作成する場合はTeraTermを利用します。
ターミナル:Tera Term Professional Version 4.48 with Japanese resource
SSHクライアント:TTSSH ( Tera Term同梱)

日本語化バージョンで説明します。
(デスクトップが日本語・ノートが英語バージョン使っている変わり者です)

メニューの[設定]-[SSHキー作成]をクリックします。
キーの種類を選択し(今回はDSA)[生成]ボタンをクリックします。
しばらく待つと秘密鍵パスワードの設定が可能になりますので、パスワードを入れて[公開鍵の保存]と[秘密鍵の保存]でそれぞれ保存します。ここで作成された公開鍵をサーバに送ります。

[UNIX系で鍵生成]
# ssh-keygen -b 1024 -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_dsa):
保存場所を聞かれますがデフォルトでよければそのままEnter

Enter passphrase (empty for no passphrase):
秘密鍵パスワードを聞かれたらパスワードを入力。
これで秘密鍵(id_dsa)、公開鍵(id_dsa.pub)が生成されます。

[UNIXサーバ側の設定]
ログインするユーザのホームディレクトリの下に認証用の公開鍵をまとめるファイルを生成します。
最初のキーの場合はcpでも良いのですが、下記コマンドであれば新規・追加両方使えます。

> cat public_keyfile >> ~/.ssh/authorized_keys
通常公開鍵はid_dsa.pubなので

> cat id_dsa.pub >> ~/.ssh/authorized_keys
authorized_keysは複数の公開鍵を追加できるので、同じユーザ利用で他のクライアント用に別の秘密鍵を用いて認証することが可能です。

セキュリティ強化

必要なサービスは揃ったので最後の仕上げにセキュリティ強化を行う。
元々無駄は省いていたが残っているのが下記の項目

・不要なユーザー/グループの削除
・ログイン時のメッセージを削除
・SSHでログインできるユーザーを制限(posrgresとかでログインされないようにする)
・ファイヤーウォールでポートの制限をする

ユーザー管理は特に説明の必要はないですね。余計なユーザーアカウントがあるとクラッキングの対象にされます。BSDだとgameユーザーとかあるので消しましょう。

ログイン時に出るメッセージによってOSの種類やバージョンがバレます。すぐに編集しましょう。
対象になっているファイルは/etc/motdです。

SSHユーザーの制限は/etc/ssh/sshd_configにAllowUsersの項目を追加し
AllowUsers user1 user2のようにスペースを開けて記述します。

ファイヤーウォールは個別に紹介。

PAM: authentication error

リモートでSSHログインが出来ないから、BSDマシンがDHCPだとダメなのか?hosts.allowに書いてないとダメなのかとやってみましたが、実はローカルでやってもダメだった。そこで出たエラーが

PAM: authentication error

何ですかねこれ?

ググッてみたらこの文章。
Note: The configuration defaults for sshd(8) have been changed. SSH
protocol version 1 is no longer enabled by default. In addition,
password authentication over SSH is disabled by default if PAM is
enabled.

翻訳したらこうなる。
注意: sshd(8)のための構成デフォルトを変えました。 セキュアシェル (SSH)

プロトコルバージョン1はデフォルトでもう可能にされません。 さらに、PAMが
有効にされるなら、SSHの上のパスワード認証はデフォルトで無効にされます。

何ー!?仕様変更でパス認証が無効になっているのか?

/etc/ssh/ssh_config内において
PasswordAuthentication yes
を有効にした時点でサーバー自身からsshログインは可能になった。
さらに、/etc/ssh/sshd_configも同様に設定すると、リモートからログインが出来たーー!!