Memo/Linux/ssh

http://dexlab.net/pukiwiki/index.php?Memo/Linux/ssh
 

ssh


Could not load host key: /etc/ssh/ssh_host_dsa_key

messagesに以下のログが出続ける事があった。
「/etc/ssh/」以下に該当ファイルが無いのが原因

  • CentOS 7.2.1511 64bit:
    1. sudo tail -f /var/log/messages
    2. sshd[1234]: error: Could not load host key: /etc/ssh/ssh_host_dsa_key
    3.  
    4. # 生成する
    5. sudo ssh-keygen -A
    6. ll /etc/ssh/ | grep dsa
    7. ...
    8. -rw-------  1 root root        668 May 25 06:14 ssh_host_dsa_key
    9. -rw-r--r--  1 root root        635 May 25 06:14 ssh_host_dsa_key.pub

sshログイン時にコマンド実行

  • 以下にファイルがあれば、ログイン時に実行される
    1. /etc/ssh/sshrc # ユーザ全体
    2. ~/.ssh/rc # 個人ユーザ毎
  • CentOS 6.x: /etc/ssh/sshrc に「env > /tmp/env.txt」と書いて取得した変数
    1. SHELL=/bin/bash
    2. TERM=xterm
    3. SSH_CLIENT=192.168.61.1 54109 22
    4. SSH_TTY=/dev/pts/2
    5. USER=user01
    6. SSH_AUTH_SOCK=/tmp/ssh-SsqZGU4422/agent.4422
    7. PATH=/usr/local/bin:/bin:/usr/bin
    8. MAIL=/var/mail/user01
    9. _=/bin/env
    10. PWD=/home/user01
    11. HOME=/home/user01
    12. SHLVL=2
    13. LOGNAME=user01
    14. SSH_CONNECTION=192.168.61.1 54109 192.168.61.128 22

account is locked

CentOS5でパスワードを設定せず、公開鍵認証だけのユーザで発生する

  • /var/log/secure
    1. User user01 not allowed because account is locked
  • /etc/shadow : パスワード部分が「!!」だと発生する
    1. user01:!!:...
  • 解決法:パスワードを設定するか、削除
    1. echo $(mkpasswd -l 16 -s 0) | sudo passwd user01 --stdin
    2. # または削除
    3. sudo passwd -d user01

認証方式を固定する

公開鍵認証やLDAPの検証など。

  • パスワード認証
    1. ssh -o PreferredAuthentications=password user@host

SSH接続が遅い場合

接続先がIPでも、何故かDNSの名前解決をしようとして遅い場合がある。

  1. vim /etc/ssh/sshd_config
  2. ----
  3. # 名前解決しない
  4. UseDNS no
  5. #  IPv4を使う
  6. AddressFamily inet
  7. # GSSAPI 認証をしない
  8. GSSAPIAuthentication no
  9. ----
  10. sudo service sshd restart

ControlMaster?:セッションを束ねて接続を早くする

  • ControlPersist? はOpenSSH 5.6以降対応。CentOS6は5.3なので非対応
  • 同一ホストへのパスワード認証も2回目はスキップされる
  • 例:
    1. cat ~/.ssh/config
    2. Host *
    3.   ControlMaster auto
    4.   ControlPath ~/.ssh/mux-%r@%h:%p
    5.   ControlPersist 10

秘密鍵から公開鍵を生成する

公開鍵が無い場合でも、秘密鍵があれば生成できる

  1. ssh-keygen -y -f ~/.ssh/test.pem

指定したコマンドのみ実行可能な公開鍵認証を設定する

sshで特定のコマンドの実行だけ許可し、実行後すぐに切断する。
複数設定したい場合は、別の公開鍵を作成すれば良いだろう。

  • 対象ホストの $HOME/.ssh/authorized_keys に追加する。例ではuptimeを実行
    1. command="uptime",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAAB3N...
  • 実行結果
    1. ssh user01@192.168.61.129
    2.  
    3.  08:01:48 up 5 min,  2 users,  load average: 0.00, 0.03, 0.00
    4. Connection to 192.168.61.129 closed.

ssh-agent, ssh-addでパスフレーズ/秘密鍵を省略

秘密鍵のパスフレーズが有効な場合、1度だけ入力すれば良いようにできる。
また、踏み台経由でログインする等、複数の秘密鍵を登録しておくと便利。

  • 単純な使い方
    1. ssh-agent bash
    2. ssh-add ~/.ssh/example.pem
    3. ssh hoge.example.com
    4.  
    5. # 終了
    6. exit
  • /.bashrc に以下を追加すれば ssh-add-sh だけで実行できる

    1. alias ssh-add-sh='eval `ssh-agent -s` ; ssh-add'
    2. ssh-add-sh

パスワード認証をやめて公開鍵認証にする場合

  • 特定のユーザだけ変更する場合
  1. 鍵が無い場合、VMや PuTTYgen等で認証鍵を作る
    1. ssh-keygen -t rsa
  2. 個人の公開鍵を ~/.ssh/authorized_keys に登録
    1. ssh-copy-id -i ~/.ssh/id_rsa.pub <username@example.com>
  3. sudoしたい場合は sudoers に登録
    1. echo 'username ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/username
    2. chmod 440 /etc/sudoers.d/username
  4. パスワード削除
    1. passwd -d <username>
  • サーバ全体でパスワード認証をやめる場合
    1. vim /etc/ssh/sshd_config
    2. ----
    3. PasswordAuthentication no
    4. ----
    5. service sshd restart

OpenSSLのHeartbleed bug修正後に発生した問題

  • 記事
  • /var/log/crond に以下のエラーが出て、cronに仕掛けたスクリプトが動作していなかった
    1. Apr  20 01:02:03 localhost crond[19000]: (root) FAILED to authorize user with PAM (M&#243;dulo desconhecido)
    • crondの再起動が必要
      1. service crond restart

Too many authentication failures ...

  • 以下のエラーでsshで接続できない場合がある
  • /var/log/secure
    1. ... sshd[10000]: Disconnecting: Too many authentication failures for <user name>
  • 解決方法
    • ssh-agentから全ての鍵を取り除く
      1. ssh-add -D
    • パスワードではなく、鍵認証に変える
    • 認証の優先をパスワードに変更
      1. ssh user@host -o PreferredAuthentications=password

sshd_configの検証

  • 'sshd -t' で検証できる。正常なら 0 を返す
    1. sudo sshd -t
    2. /etc/ssh/sshd_config: line 139: Bad configuration option: hoge
    3. /etc/ssh/sshd_config: terminating, 1 bad configuration options
    4.  
    5. echo $?
    6. 255
  • /etc/ssh/sshd_config 以外のパスにあるファイルを検証する場合
    1. sudo sshd -t -f /path/to/sshd_config

SSHで空パスワードでのログインを許可する

  • ローカルVMでCIツールと連動する場合など。
  • 当然、インターネットに出ているサーバに設定してはいけない
  • CentOS6.x
    1. sudo useradd user1
    2. sudo passwd -d user1
    3.  
    4. sudo vim /etc/ssh/sshd_config
    5. ----
    6. PermitEmptyPasswords yes
    7. ----
    8. sudo /sbin/service sshd reload

ssh接続時に詳細を表示

  • -v オプションで表示される

並列SSH pssh(Parallel ssh)

sshで複数の秘密鍵を使い分ける

  1. vi ~/.ssh/config
  2. ----
  3. IdentityFile ~/.ssh/example1.pem
  4. IdentityFile ~/.ssh/example2.pem
  5. ----

sshリモートコマンド

  • パイプ。例:remotehostの/var/log/messageに記録する例
    1. ssh user@remotehost 'date | logger -t test'
  • リモートからsudoするとエラーになる場合
    • sudo: no tty present and no askpass program specified : CentOS5.xの場合に発生。CentOS6.xの場合は出ない。'-t'オプションでttyを割り当てる
      1. ssh -t shutdown@192.168.1.100 "sudo /sbin/shutdown"
    • sudo: sorry, you must have a tty to run sudo : tty(端末)なしの場合でもsudoできるように設定する
      1. visudo
      2. ----
      3. Defaults    !requiretty
      4. ----
  • whileループ時には"-n"オプション付けないと1回で停止する
    1. while read line; do
    2.     # -o StrictHostKeyChecking チェックの無視
    3.     # -n sshの標準入力を/dev/nullにし、バックグラウンドモードになる
    4.  
    5.     # 順次実行(標準出力に表示される)
    6. #    ssh -n -o StrictHostKeyChecking=no user@hostname "/bin/bash /tmp/YOUR_COMMAND.sh"
    7.  
    8.     # 並列実行(標準出力には表示されず、すぐに返ってくる)
    9.     ssh -n -o StrictHostKeyChecking=no user@hostname "/bin/bash /tmp/YOUR_COMMAND.sh < /dev/null > /dev/null 2> /dev/null &"
    10. done < filename

ssh, scp接続時のフィンガープリントの確認をしない

  • 「Are you sure you want to continue connecting (yes/no)?」エラーが出る場合
  • 1回だけ
    1. ssh -o StrictHostKeyChecking=no root@hostname
  • /.ssh/config に指定

    1. Host *
    2. StrictHostKeyChecking no
    3. UserKnownHostsFile /dev/null

sshでのタイムアウトを防ぐ

  • サーバ側
    1. /etc/ssh/sshd_config
    2. ----
    3. ClientAliveInterval 300
    4. ClientAliveCountMax 0
    5. ----
    6. service sshd restart
  • クライアント側
    1. mkdir -p ~/.ssh
    2. chmod 700 ~/.ssh
    3. cat >> ~/.ssh/config << 'EOS'
    4. Host *
    5.     IdentityFile               ~/.ssh/id_rsa
    6.     ForwardAgent               yes
    7.     ServerAliveInterval        15
    8.     ServerAliveCountMax        4
    9. EOS
    10. chmod 600 ~/.ssh/config

SSH代替mosh


対話処理の自動化

  1. #!/bin/sh
  2. fdasd /dev/dasdg << EOF
  3. v
  4. MYVOL1
  5. w
  6. EOF

ssh config

  • ウノウラボ Unoh Labs 快適なsshクライアント生活
    • $HOME/.ssh/config
      1. Host dev*
      2.     User                        hiroki
      3.     HostName                    dev.01.labs.unoh.net
      4.     IdentityFile                ~/.ssh/id_rsa.unoh
      5.     ProxyCommand                ssh op.labs.unoh.net nc -w 6000 %h %p
      6.  
      7. Host home
      8.     User                        hirocaster
      9.     HostName                    home.hiroki.jp
      10.     IdentityFile                ~/.ssh/id_rsa.home
      11.  
      12. Host *
      13.      IdentityFile               ~/.ssh/id_rsa
      14.      ForwardAgent               yes
      15.      ServerAliveInterval        15
      16.      ServerAliveCountMax        3
      17.      StrictHostKeyChecking      no
      18.      UserKnownHostsFile         /dev/null

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

このWARNはリモートホストが変わったという事

  • コマンドで削除するか、「~/.ssh/known_host」から手動で消す。
    1. ssh-keygen -R <hostname>

多段ssh/sshポートフォワーディング

  • sshポートフォワーディングの例。localのmysqlクライアントから gateway.hostを通じて、other.host上のmysql serverへ接続
    1. ssh -fNg -L 13306:other.host:3306 gw_user@gateway.host
    2.  
    3. # mysqlで接続(mysql側のgrantで 'user'@'%' ユーザを作ってあること。'user'@'localhost'ユーザがいても、mysql -h localhostだと失敗する)
    4. mysql -A -u user -p -h 127.0.0.1 -P 13306 mysql
    5. mysql> quit
    6.  
    7. # sshポートフォワーディングを終了
    8. pkill -u $USER -f 13306:
  • OpenSSH 5.4 以上: '-W'オプション(netcat)が使えるので、簡単になる
    • client.host上で実行
      1. ssh -o 'ProxyCommand=ssh gw_user@gateway.host -W %h:%p' other_user@other.host
  • OpenSSH 5.3以下: 踏み台に ncコマンドが必要。(CentOS6.5はOpenSSH 5.3)
    • gateway.host(踏み台)に ncのインストール
      1. sudo yum install nc
    • client.host上で実行
      1. ssh -o 'ProxyCommand=ssh gw_user@gateway.host nc %h %p' other_user@other.host
  • 接続設定を~/.ssh/configに追加し、公開鍵認証を使う場合
    • client.host上で gateway.host へ接続できるように設定
      1. # 公開鍵がなければ作成(default: ~/.ssh/id_rsa)
      2. ssh-keygen -t rsa -f ~/.ssh/id_rsa
      3.  
      4. ssh-copy-id -i ~/.ssh/id_rsa.pub gw_user@gateway.host
      5. # 接続できるか確認
      6. ssh gw_user@gateway.host
    • gateway.host 上で other.host へ接続できるように設定
      1. ssh-copy-id -i ~/.ssh/id_rsa.pub other_user@other.host
      2. # 接続できるか確認
      3. ssh other_user@other.host
    • client.host上の ~/.ssh/config に設定を追加
      1. vim ~/.ssh/config
      2. ----
      3. Host gateway.host
      4.    ProxyCommand none
      5.    User gw_user
      6.    IdentityFile ~/.ssh/id_rsa
      7.  
      8. Host other.host
      9.    User other_user
      10.    # OpenSSH version 5.4 or later:
      11.    ProxyCommand ssh -W %h:%p gateway.host
      12.    # OpenSSH version 5.3 or lower:
      13.    # sudo yum install nc
      14. #   ProxyCommand ssh gateway.host nc %h %p 2> /dev/null
      15.    IdentityFile ~/.ssh/id_rsa
      16. ----
    • client.host上からユーザ、パスワード指定なしでother.hostに接続できれば成功
      1. ssh other.host
      2.  
      3. scp dummy.txt other.host:/tmp/
    • エラー「ssh_exchange_identification: Connection closed by remote host」の場合、.ssh/config の「 2> /dev/null」を削除して実行してみる。gatewayにncがインストールされていないとエラーになる。
      1. bash: nc: コマンドが見つかりません
      2. ssh_exchange_identification: Connection closed by remote host

公開鍵認証

  • 公開鍵認証のみに変更
    1. ssh-keygen -N "" -t rsa
    2.  
    3. # ファイル名やコメントを指定したい場合
    4. ssh-keygen -N "" -t rsa -f my-ssh-key -C "my ssh key file"
    5.  
    6. cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    7. chmod 600 ~/.ssh/authorized_keys
    8.  
    9. vi /etc/ssh/sshd_config
    10. ----
    11. PermitRootLogin without-password
    12. PasswordAuthentication no
    13. ----
    14.  
    15. service sshd restart

公開鍵の登録

  • ssh-copy-idが便利
    1. ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host
    • ポートを指定する場合
      1. ssh-copy-id -i ~/.ssh/id_rsa.pub "user@remote_host -p 10022"
  • ssh-copy-idが無い場合
    1. cat ~/.ssh/id_rsa.pub | ssh user@remote_host "cat >> ~/.ssh/authorized_keys"
  • 公開鍵末尾のスペース以降はコメントなので、判別しやすいコメントを付けると良い
    ssh-rsa AAAAB3N...YFd8w6Q== username@example.com

sshで必ずパスワードを要求されてしまうときは

パスワードなしでログインしようとして、 authorized_keysに公開鍵を追加してもパスワードを要求されてしまう場合はオーナー、パーミッションを確認しましょう。
パーミッションの設定が正しくないと接続できないようです。
私が失敗したときは、~/.ssh/が0770でした。

filenamepermission
/home/userOK: 0700
OK: 0755
NG: 0770
~/.ssh/0700
~/.ssh/authorized_keys0600

sshでパスワードなしにログインする(公開鍵認証)

公開鍵を作成し、それを相手サーバに登録する事でパスワード入力なしにログイン可能となる。

  1. 登録側ユーザになって、RSA鍵を作成する
    $ su - hoge
    $ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/hoge/.ssh/id_rsa): 
    /home/example/.ssh/id_rsa already exists.
    Overwrite (y/n)? y
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /home/hoge/.ssh/id_rsa.
    Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.
    The key fingerprint is:
  2. 公開鍵(id_rsa.pub)を相手側サーバに登録する
    $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    $ chmod 755 ~/.ssh
    $ chmod 600 ~/.ssh/authorized_keys
    $ scp $USER@$SSH_HOST:.ssh/{identity,id_rsa,id_dsa}  ~/.ssh/
  • 全て同じキーにしてしまう場合

    /.ssh/以下のファイルが全てなので、authorized_keysに登録後、scpで同期してしまえば良い。
    ※$USER,$SSH_HOSTは適時に読み替える事。

scp ~/.ssh/{id_rsa,id_rsa.pub,aut install P/PE/PETDANCE/ack-1.58.tar.gz
  • 使い方
    ack [options] PATTERN [FILE...]
    ack -f [options] [DIRECTORY...]
    /dev/null

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-04 (火) 16:43:35 (379d)