楽になるためのエンジニアリング

楽に暮らせることを目指すエンジニアのインプット&アウトプット

新卒の時にしっかり調べておきたかったweb知識 ~ssh編~

新卒の時になんとなく調べて、そのままなんとなく使っていたのでちゃんと調べて残しておく

SSHとは?

Secure Shellの略。 安全にリモート通信を行うための"クライアント"でプロトコルの1種。

プロトコルにはいくつかの階層がある。 同じ階層にいるのはPCよりweb閲覧等を行う際に使用するHTTP通信など。 (参考 : TCP/IPプロトコルとは パソコン初心者講座)

sshdについて

ssh通信を受けるデーモン。 リモート側で起動され、sshクライアントからのリクエストをlistenする。 これが動作していないとローカル等からのsshを利用したログインを受けることができない。

aws等でインスタンスを立ち上げた場合、最初からインストールされ立ち上げ時に自動的に起動されている。 起動確認

$ ps aux | grep sshd
root     15340  0.0  0.7 119912  7280 ?        Ss   22:43   0:00 sshd: admin [priv]
root     31275  0.0  0.3  80460  3176 ?        Ss   May22   0:00 /usr/sbin/sshd
$ sudo service sshd status
openssh-daemon (pid  31275) is running...

起動する必要がある場合サンプル

sudo service sshd restart

設定ファイルはこちら

/etc/ssh/sshd_config

sshのやり方

以下の2つの方法がある

  • パスワード認証

  • 公開鍵認証

パスワード認証

基本推奨されていない。 sshdの設定ファイルでは、デフォルトでNOとなっている

事前準備

ユーザーのパスワードを設定する

$ passwd
ユーザー admin のパスワードを変更。

現在の設定の確認

$ cat /etc/ssh/sshd_config | grep PasswordAuthentication
PasswordAuthentication no

yesにし、sshdを再起動する

$ sudo vim /etc/ssh/sshd_config
$ cat /etc/ssh/sshd_config | grep PasswordAuthentication                                                                                                                 
PasswordAuthentication yes

$ sudo service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]
ssh実行

パスワードでsshできた。

$ ssh [:username]@[:hostname]
[:username]@[:hostname]'s password: 
Last login: Wed May 22 00:50:01 2019 from xxxxxxxxxxxxxxxxxxxx

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
49 package(s) needed for security, out of 70 available
Run "sudo yum update" to apply all updates.

*確認できたら、安全ではないためsshdの設定を戻しておく*

公開鍵認証のやり方

1. 鍵の作成
# 生成コマンド
$ ssh-keygen -t rsa
Generating public/private rsa key pair.

# 生成する鍵のファイルを指定する
# 何も入力せずEnterすれば、( )にて指定されているファイルにて生成される
Enter file in which to save the key (/Users/[:user_name]/.ssh/id_rsa): /Users/[:user_name]/.ssh/id_rsa_test

# 鍵のパスフレーズを2度入力する
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

# 作成完了
Your identification has been saved in /Users/[:user_name]/.ssh/id_rsa_test.
Your public key has been saved in /Users/[:user_name]/.ssh/id_rsa_test.pub.
The key fingerprint is:
16:89:2b:9c:c8:39:b8:15:6d:e7:11:49:b7:9b:eb:0d [:user_name]@[:user_pc_name]
The key's randomart image is:
+--[ RSA 2048]----+
|     .o..        |
|   .  .+ o       |
|  . o + +        |
| o * + o +       |
|. * + o S        |
| o . . . .       |
|.       E        |
|       . o       |
|        . .      |
+-----------------+
# 確認
$ ls .ssh/id_rsa_test*
.ssh/id_rsa_test     .ssh/id_rsa_test.pub
2. 鍵の設置

リモート(接続先)の/home/[:user_name]/.ssh/authorized_keysに公開鍵を設置する

  • vi 等で生成した公開鍵(.pubが付いている方)を開き、内容を直接/home/[:user_name]/.ssh/authorized_keysに書き込む

  • 公開鍵(.pubが付いている方)をscp等でリモート(接続先)に設置できるならば下記コマンドで書き込む

cat id_rsa_test.pub >> /home/[:user_name]/.ssh/authorized_keys
3. 接続

ローカルからsshコマンドで接続を行う

ssh -l [:user_name] -i [:private_key_path] [:host_name or ip]

ssh -l admin -i ~/.ssh/id_rsa_test 12.345.678.90

パスプレーズを聞かれるので入力 (鍵を盗まれてもパスプレーズがわからなければ接続できないということ)

ssh鍵認証時のパスフレーズ入力画面
ssh鍵認証時のパスフレーズ入力画面

認証が通れば接続完了

Last login: Fri May 24 12:14:04 2019 from xxxxxxxxxxxxxxxxxxxxxx

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
49 package(s) needed for security, out of 70 available
Run "sudo yum update" to apply all updates.

よく使うsshコマンドのオプション

全てを確認したい場合は man ssh で調べる。

# ssh時に使用する秘密鍵を指定する。秘密鍵ファイルのパスをオプションに続いて記載する。
ssh -i [:path_to_ssh]
# sshするユーザーを指定する。ユーザー名をオプションに続いて記載する。
ssh -l [:user_name]
# リモートの接続する際のポート番号を指定する。ポート番号をオプションに続いて記載する。
ssh -p [:port_number]
# sshする際に認証エージェントの転送を許可する。ssh接続先で認証エージェントを引き続き使用したい場合、指定する。
ssh -A

.ssh/configを記載する

.ssh/configにリモートへの接続に使用する設定を記載しておくといろいろな接続が楽になる。 サンプル

# .ssh/config
Host my_remote_host                                                                                                                                                       
    HostName 12.34.567.890                                                                                                                                                     
    IdentityFile    ~/.ssh/id_rsa                                                                                                                                        
    User            admin
    ForwardAgent yes

# sshする際のコマンド
ssh my_remote_host

よく使用する記載方法

  • Host : ssh接続する際に使用するホスト名

  • HostName : 接続先を指定するためのhostname または IP

  • User : ログインするユーザー名

  • ForwardAgent yes : 認証エージェントを引き続き使用する場合に記載する

  • Port : 接続先の使用するポート番号

  • IdentityFile : 接続時に使用する認証鍵ファイルパス

その他sshコマンドでできること

踏み台サーバーを経由してリモートアクセスをする

場合によっては、特定のホストAからしsshできないようIP等に制限をかけているホストBがある。 その場合 ローカル => ホストA => ホストB という流れでsshを行う。

コマンドは以下の形となる

ssh -oProxyCommand='ssh -W %h:%p -i [:host_A_key_file] -l [:host_A_user] [:host_A]'  -i [:host_B_key_file] -l [:host_B_user] [:host_B]

.ssh/config に記載する場合

Host host_A
    HostName [:host_A_name/ip]                                                                                                                                                
    IdentityFile [:host_A_key_file]                                                                                                                     
    User [:host_A_user]
    ForwardAgent yes
Host host_B
    HostName [:host_B_name/ip]                                                                                                                                                
    IdentityFile [:host_B_key_file]                                                                                                                     
    User [:host_B_user]
    ProxyCommand ssh -W %h:%p host_A

リモートで指定したコマンドを実行する

sshコマンド後に "" でコマンドを囲って記載すれば指定したリモート先に都度ログインせず実行できる

ssh [:remote_host_name] "[:command]"
$ ssh my_remote_host "ls .ssh/."
authorized_keys
id_rsa_test.pub

こんな感じで複数サーバーのログ取得とかもできる。

https://github.com/rakuraku0615/server_tools/blob/master/tail_hosts_phplog.sh