Slide 1

Slide 1 text

.ssh/configを管理する .ssh/configで管理する Kenʼichiro Oyama Fusic Co.,Ltd. 2016.11.3 1 PHPカンファレンス2016

Slide 2

Slide 2 text

みなさん SSHしてますか? 2 PHPカンファレンス2016

Slide 3

Slide 3 text

わたしは SSHしてます 3 PHPカンファレンス2016

Slide 4

Slide 4 text

?> NEXT PHPカンファレンス2016のテーマ 4 PHPカンファレンス2016

Slide 5

Slide 5 text

SSHとNEXT 5 PHPカンファレンス2016   FTP   SSH + パスワード   SSH + 公開鍵認証   「SSHしたら負け」 <- たぶんここがNEXT   Docker、EC2 Run Command、etc “NEXT”ではないですが、 今⽇は”SSH + 公開鍵認証”で少しだけ役に⽴ちそ うな話をします

Slide 6

Slide 6 text

Who 6 PHPカンファレンス2016

Slide 7

Slide 7 text

k1LoW   Kenʼichiro Oyama   @k1LoW   Fusic Co.,Ltd. エンジニア   基盤ユニット テックリード   GitHub organizations   fukuokarb / dotcake / emacs-jp / etc.   awspecというAWS⽤のテストツールを作って います   https://github.com/k1LoW/awspec 7 PHPカンファレンス2016

Slide 8

Slide 8 text

普段のわたし   複数のプロジェクト   開発中   運⽤中   複数のサーバ   プロジェクト単位   ロール単位(Web、DB、etc)   本番、ステージング、テスト 8 PHPカンファレンス2016

Slide 9

Slide 9 text

イメージ   複数のプロジェクトの複数のサーバにSSH 9 PHPカンファレンス2016

Slide 10

Slide 10 text

~/.ssh/config   SSH接続の管理をするための設定ファイル   ~/.ssh/configはユーザごとの設定ファイル 10 PHPカンファレンス2016  Host github.com   User git   Hostname github.com   PreferredAuthentications publickey   IdentityFile ~/.ssh/github_rsa

Slide 11

Slide 11 text

/home/k1low/.ssh/config   管理しているサーバへSSH接続するための設定 を記載   秘密鍵も .ssh/ 以下に配置   プロジェクトごと、ロールごと、サーバごとな どで分けることが多い   id_rsaは使わない   秘密鍵だけでなく、その他の接続設定も重要   HostnameやUser   ProxyCommandとか 11 PHPカンファレンス2016

Slide 12

Slide 12 text

.ssh/config どうやって管理していますか? 12 PHPカンファレンス2016

Slide 13

Slide 13 text

.ssh/configの管理   configのバックアップ/リストア   秘密鍵のバックアップ/リストア   サーバ接続情報の追加/削除   チームメンバーへの共有   踏み台サーバなど他サーバへの設置 13 PHPカンファレンス2016

Slide 14

Slide 14 text

configと秘密鍵に分かれていて ⾯倒 14 PHPカンファレンス2016

Slide 15

Slide 15 text

configは分割できないので メンバーへの共有も⾯倒 15 PHPカンファレンス2016

Slide 16

Slide 16 text

今のconfigとバックアップした configのマージも⾯倒 16 PHPカンファレンス2016

Slide 17

Slide 17 text

sconb 17 PHPカンファレンス2016

Slide 18

Slide 18 text

sconb   “Ssh CONfig Buckup tool”   .ssh/config専⽤のバックアップツール   https://github.com/k1LoW/sconb   gem install sconb でインストール   ※本⽇も⼤変お世話になっているCONBUとは無関係です 18 PHPカンファレンス2016

Slide 19

Slide 19 text

使い⽅ 19 PHPカンファレンス2016

Slide 20

Slide 20 text

バックアップ 20 PHPカンファレンス2016  $ sconb dump > ssh_config.json  $ cat ssh_config.json  {   "github.com": {   "Host": "github.com",   "User": "git",   "Hostname": "github.com",   "PreferredAuthentications": "publickey",   "IdentityFile": [   "~/.ssh/github_rsa"   ]   },  ...

Slide 21

Slide 21 text

絞り込んでバックアップ 21 PHPカンファレンス2016  $ sconb dump example > ssh_config.json  $ cat ssh_config.json  {   ”example.com": {   "Host": ”example.com",   "User": ”k1low",   "Hostname": ”dev.example.com",   "PreferredAuthentications": "publickey",   "IdentityFile": [   "~/.ssh/example_rsa"   ]   }  }

Slide 22

Slide 22 text

リストア 22 PHPカンファレンス2016  $ sconb restore < ssh_config.json  Host github.com   User git   Hostname github.com   PreferredAuthentications publickey   IdentityFile ~/.ssh/github_rsa  ...  $ sconb restore < ssh_config.json > ~/.ssh/cofing

Slide 23

Slide 23 text

秘密鍵も含めて1ファイル化 23 PHPカンファレンス2016  $ sconb dump --all > ssh_config_with_key.json  $ cat ssh_config_with_key.json  {   "github.com": {   "Host": "github.com",   "User": "git",   "Hostname": "github.com",   "PreferredAuthentications": "publickey",   "IdentityFile": [   "~/.ssh/github_rsa"   ],   "IdentityFileContent": [   "-----BEGIN RSA PRIVATE KEY-----\nMIIEpXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX... ]   },  ...

Slide 24

Slide 24 text

秘密鍵のリストア 24 PHPカンファレンス2016  $ sconb keyregen < ssh_config_with_key.json  Regenerate ~/.ssh/github_rsa ...  ...

Slide 25

Slide 25 text

つまり ssh_config <-> JSON のコンバータ 25 PHPカンファレンス2016

Slide 26

Slide 26 text

パイプで各種UNIXコマンドとも 連携できる 26 PHPカンファレンス2016

Slide 27

Slide 27 text

jqを使ったssh_confg.jsonのマージ   jq: JSONをいい感じに操作できるコマンド 27 PHPカンファレンス2016  $ jq -s '.[0] + .[1]’ a.json b.json | sconb restore > ~/.ssh/config

Slide 28

Slide 28 text

.ssh/configを管理する sconbはおいしい 28 PHPカンファレンス2016

Slide 29

Slide 29 text

別の視点から 29 PHPカンファレンス2016

Slide 30

Slide 30 text

普段のわたし(再掲)   複数のプロジェクト   開発中   運⽤中   複数のサーバ   プロジェクト単位   ロール単位(Web、DB、etc)   本番、ステージング、テスト 30 PHPカンファレンス2016

Slide 31

Slide 31 text

イメージ(再掲)   複数のプロジェクトの複数のサーバにSSH 31 PHPカンファレンス2016

Slide 32

Slide 32 text

突然の◯penSSLの脆弱性発表 32 PHPカンファレンス2016

Slide 33

Slide 33 text

インベントリ情報   「サーバにイントールされているパッケージの バージョン⼀覧を再度確認して欲しい」   現在稼働しているサーバ数⼗台   まったく別の時期にまったく別のサービスを 構築している   全部SSHでログインして確認。。。??そして その後まとめるの。。。?   ツラみがある。。。 33 PHPカンファレンス2016

Slide 34

Slide 34 text

34 koma PHPカンファレンス2016

Slide 35

Slide 35 text

koma   エージェントレスでリモートホストのインベン トリ情報を収集するツール   https://github.com/k1LoW/koma   類似ツール: ohai / facter   gem install koma でインストール   `ssh` を `koma ssh` に変えるだけで、リモ ートホストのインベントリ情報をJSONで取得 できる 35 PHPカンファレンス2016

Slide 36

Slide 36 text

koma ssh 36 PHPカンファレンス2016  $ koma ssh example.com  {   "memory": {   "swap": {   "cached": "652kB",   "total": "2097148kB",   "free": "2091376kB"   },   "total": "1019956kB",   "free": "255104kB",   "buffers": "310644kB",   "cached": "185748kB",   ...

Slide 37

Slide 37 text

koma keys (収集できるインベントリ情報)   memory   ec2 (disabled)   hostname   domain   fqdn   platform   platform_version   filesystem   cpu   virtualization   kernel   block_device   package   user   group   service PHPカンファレンス2016 37

Slide 38

Slide 38 text

koma run-command 38 PHPカンファレンス2016  $ koma run-command example.com,example.jp uptime  {   "example.com": {   "uptime": {   "exit_signal": null,   "exit_status": 0,   "stderr": "",   "stdout": " 00:18:10 up 337 days, 4:51, 1 user, load average: 0.08, 0.02, 0.01\n"   }   },   "example.jp": {   "uptime": {  ...

Slide 39

Slide 39 text

そう、.ssh/configが設定されて いればね! 39 PHPカンファレンス2016

Slide 40

Slide 40 text

.ssh/configで管理する 40 PHPカンファレンス2016

Slide 41

Slide 41 text

ssh_config形式で管理する .ssh/configで管理する 41 PHPカンファレンス2016

Slide 42

Slide 42 text

koma with ssh_config   komaはssh_config形式のフォーマットを STDINから読み込んで実⾏することができる   Vagrant上のOSのcpu情報を取得   sconbをでHostをフィルタリング 42 PHPカンファレンス2016  $ vagrant ssh-config | koma ssh --key cpu  $ sconb dump dev.* | sconb restore | koma ssh

Slide 43

Slide 43 text

Vuls 43 PHPカンファレンス2016

Slide 44

Slide 44 text

Vuls   “VULnerability Scanner”   バルス   Linux/FreeBSD向けの脆弱性スキャンツール   Ubuntu、Debian、CentOS、Amazon Linux、RHELに対応   標準のTUIだけでなくVulsRepoというWebビューワもある   NVDやJVNの脆弱性情報などを使⽤してスキャン   スキャン対象のサーバーへは “SSH” で接続   TOMLで設定を記述 44 PHPカンファレンス2016

Slide 45

Slide 45 text

SSH。。。だと。。? 45 PHPカンファレンス2016

Slide 46

Slide 46 text

ssh_config_to_vuls_config 46 PHPカンファレンス2016

Slide 47

Slide 47 text

ssh_config_to_vuls_config   ssh_config形式をVuls⽤のTOMLファイル形式 に変換   sc2vcコマンド   https://github.com/k1LoW/ssh_config_to_vuls_config   gem install ssh_config_to_vuls_config でインストール   (当然)sconbでフィルタリングも可能 47 PHPカンファレンス2016  $ cat ~/.ssh/config | sc2vc > vuls_config.toml  $ sconb dump dev.* | sconb restore | sc2vc > filtered_config.toml

Slide 48

Slide 48 text

.ssh/config -> JSON JSON -> .ssh/config JSON -> koma JSON -> Vuls 48 PHPカンファレンス2016

Slide 49

Slide 49 text

NEXT 49 PHPカンファレンス2016

Slide 50

Slide 50 text

ssh_configファイルを集約すれば サーバインベントリ情報も 脆弱性情報も 管理できるのでは? 50 PHPカンファレンス2016

Slide 51

Slide 51 text

こんなサーバを 51 PHPカンファレンス2016

Slide 52

Slide 52 text

.ssh/configで管理 52 PHPカンファレンス2016

Slide 53

Slide 53 text

komad (仮)   sconbなJSONをAPI or SCP経由で登録   ssh_config + komaでサーバインベントリ情報 を収集管理   ssh_config + Vulsで脆弱性情報を収集管理   koma run-commandでSSHを通じた外形監視   ちょっと変わったサーバ管理/監視システムが できそう 53 PHPカンファレンス2016

Slide 54

Slide 54 text

.ssh/configで管理する 54 PHPカンファレンス2016

Slide 55

Slide 55 text

まとめ 55 PHPカンファレンス2016

Slide 56

Slide 56 text

まとめ   .ssh/configをsconbでJSON形式にすることで 管理容易性、再利⽤性を向上   .ssh/configやssh_config形式のフォーマット を⼊⼒として動くエージェントレスなサーバイ ンベントリ収集ツール koma   Vulsの設定の元として.ssh/configの活⽤   ssh_configを活⽤したサーバ管理/監視システ ムkomad(仮)の可能性 56 PHPカンファレンス2016

Slide 57

Slide 57 text

さっそく .ssh/configを整理しましょう 古い設定、残っていませんか? 57 PHPカンファレンス2016

Slide 58

Slide 58 text

Thank you!  Fusicはテクノロジーが  好きなエンジニアを募集しています  https://fusic.github.io 58

Slide 59

Slide 59 text

?> 59 PHPカンファレンス2016

Slide 60

Slide 60 text

NEXT 60 PHPカンファレンス2016

Slide 61

Slide 61 text

イメージ(再掲)   複数のプロジェクトの複数のサーバにSSH 61 PHPカンファレンス2016

Slide 62

Slide 62 text

サーバのユーザを管理したい   どのサーバにどのユーザがSSHログインできる のか   簡単なものでいい   ある程度でいい   もしくはSSHログインできる情報をもらえるよ うにしたい   公開鍵とか秘密鍵とかの管理 62 PHPカンファレンス2016

Slide 63

Slide 63 text

⼀般的な⽅法 63 PHPカンファレンス2016

Slide 64

Slide 64 text

PAM   Pluggable Authentication Module   PAMを使ってユーザ管理サーバ(認証基盤)に 認証の要求をもらう   ADとかLDAPが⼀般的らしい   ただ個⼈的にはSTNS推し   シンプル   設定がTOML   認証サーバ側をサーバレスにできそう   http://qiita.com/shogomuranushi/items/ f09fcdeb146b45452403   新イケメンことP⼭さん(@pyama86)が開発している 64 PHPカンファレンス2016

Slide 65

Slide 65 text

だかしかし 65 PHPカンファレンス2016

Slide 66

Slide 66 text

プロジェクトを横断できない   完全弊社都合 66 PHPカンファレンス2016

Slide 67

Slide 67 text

komad(仮)がssh_configを 払い出したらどうだろう 67 PHPカンファレンス2016

Slide 68

Slide 68 text

komad(仮)にもらう   API経由でssh_config.jsonをもらう 68 PHPカンファレンス2016

Slide 69

Slide 69 text

どうでしょう。。?   イビツなのは承知   komad(仮)サーバの運⽤。。。   無理があるか。。。 69 PHPカンファレンス2016

Slide 70

Slide 70 text

Thank you!  Fusicはテクノロジーが  好きなエンジニアを募集しています  https://fusic.github.io 70