Memo/Linux/ssh

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

ssh


sshコマンドでパスワード認証を強制する

  • パスワード認証の確認
    ssh -o PreferredAuthentications=password <user>@<host or ip>
  • 複数ホストの確認
    HOSTS="192.168.1.2 192.168.1.3"
    for ip in $HOSTS; do \
      echo "-- $ip"; \
      ssh -o PreferredAuthentications=password $ip hostname;\
    done

秘密鍵にパスフレーズを追加する

  • パスフレーズ無し秘密鍵にも後から追加できる
  • AES128/AES256当たりが良い
    openssl rsa -in id_rsa -aes128 -out id_rsa.aes128
    chmod 600 id_rsa.aes128

Includeでssh/configを分割する

OpenSSH 7.3以上で「Include」が使用可能になった。


ssh-copy-id: ERROR: failed to open ID

  • CentOS 7のssh-copy-idは「-i pubkey」で指定された場所の秘密鍵の存在チェックをしている。「-f」でチェックしない。
    ssh-keygen -N "" -t rsa -f test -C test
    cp test.pub /tmp/
    ssh-copy-id -i /tmp/test.pub localhost
    
    /usr/bin/ssh-copy-id: ERROR: failed to open ID file '/tmp/test': No such file or directory
            (to install the contents of '/tmp/test.pub' anyway, look at the -f option)
  • CentOS 6:
    rpm -qf /usr/bin/ssh-copy-id
    openssh-clients-5.3p1-122.el6.x86_64
    
    ssh-copy-id
    Usage: /usr/bin/ssh-copy-id [-i [identity_file]] [user@]machine
  • CentOS 7:
    rpm -qf /usr/bin/ssh-copy-id
    openssh-clients-7.4p1-12.el7_4.x86_64
    
    ssh-copy-id
    Usage: /usr/bin/ssh-copy-id [-h|-?|-f|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname
            -f: force mode -- copy keys without trying to check if they are already installed
            -n: dry run    -- no keys are actually copied
            -h|-?: print this help

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

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

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

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

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

account is locked

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

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

認証方式を固定する

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

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

SSH接続が遅い場合

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

vim /etc/ssh/sshd_config
----
# 名前解決しない
UseDNS no
#  IPv4を使う
AddressFamily inet
# GSSAPI 認証をしない
GSSAPIAuthentication no
----
sudo service sshd restart

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

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

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

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

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

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

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

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

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

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

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

    alias ssh-add-sh='eval `ssh-agent -s` ; ssh-add'
    ssh-add-sh ~/.ssh/example.pem

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

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

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

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

Too many authentication failures ...

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

sshd_configの検証

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

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

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

ssh接続時に詳細を表示

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

並列SSH pssh(Parallel ssh)

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

vi ~/.ssh/config
----
IdentityFile ~/.ssh/example1.pem
IdentityFile ~/.ssh/example2.pem
----

sshリモートコマンド

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

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

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

    Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

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

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

SSH代替mosh


対話処理の自動化

#!/bin/sh
fdasd /dev/dasdg << EOF
v
MYVOL1
w
EOF

ssh config

  • ウノウラボ Unoh Labs 快適なsshクライアント生活
    • $HOME/.ssh/config
      Host dev*
          User                        hiroki
          HostName                    dev.01.labs.unoh.net
          IdentityFile                ~/.ssh/id_rsa.unoh
          ProxyCommand                ssh op.labs.unoh.net nc -w 6000 %h %p
      
      Host home
          User                        hirocaster
          HostName                    home.hiroki.jp
          IdentityFile                ~/.ssh/id_rsa.home
      
      Host *
           IdentityFile               ~/.ssh/id_rsa
           ForwardAgent               yes
           ServerAliveInterval        15
           ServerAliveCountMax        3
           StrictHostKeyChecking      no
           UserKnownHostsFile         /dev/null

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

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

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

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

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

公開鍵認証

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

公開鍵の登録

  • ssh-copy-idが便利
    ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host
    • ポートを指定する場合
      ssh-copy-id -i ~/.ssh/id_rsa.pub "user@remote_host -p 10022"
  • ssh-copy-idが無い場合
    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: 2018-09-15 (土) 07:31:38 (9d)