主にssh,git関連のメモ。環境はec2のamazon linux。

refs
gitにsshで接続(ポートと秘密鍵を指定)
sshのポート番号を変更
AWS EC2インスタンスにssh接続するまで その1
ユーザの追加と削除。adduser/deluser
Linuxでssh接続。公開鍵認証やパスワード認証とか
sshdのログファイル確認

まず、configに書かないで、sshを使ってgit cloneする場合。hoge.gitはリモートのbareリポジトリ。ローカル環境にlocalhoge.gitでcloneする。
$ git clone ssh://ec2-user@***.***.***.***:22/home/ec2-user/hoge.git localhoge.git
22番ポートなら省略可能。もしかしたら、事前にssh-add で秘密鍵をssh agentに登録する必要があるかも。

ssh接続したとき(失敗も成功も)、ログアウトした時、su,sudoコマンドをしたとき、sshでgit clone,git pushでリモートと通信したときのログは/var/log/secureに出力される。接続元のIP、指定ユーザ名、接続の成否などが記録される重要なログ。ただ、gitで通信した場合、IPは出力されるけど、gitのログ、誰か?操作は何か?は出力されない。おそらくgitの独自のログを見る必要がありそう。それがどこにあるかはまだ調べてない、不明。あと、secureログの解析、統計ツールみたいな物が何かあるはず。

・sshのポート番号を変更する
/etc/ssh/sshd_configファイルのPort 22を変更し、再起動する。service sshd restart

55555に変更。ポート番号を指定する
$ git clone ssh://ec2-user@***.***.***.***:55555/home/ec2-user/hoge.git localhoge.git
ssh接続の場合
$ ssh -i ~/.ssh/hoge_key.pem ec2-user@***.***.***.*** -p 55555
configファイルに書くのなら、Port属性も追加する。

・新規ユーザを作成し、ssh接続、git通信ができるようにする
前提としてec2-userと同じ公開鍵を使う

まずはrootになってadduserコマンドで新規ユーザssh-userを追加。
$ adduser ssh-user
パスワード設定
$ passwd ssh-user
$HOMEの下に.sshディレクトリ作成

$ mkdir .ssh
ec2-userの公開鍵認証の情報ファイルauthorized_keysをコピー。このファイルには、複数の公開鍵が記載されているので、許可しない鍵などがあれば削除したりする事。
$ cp /home/ec2-user/.ssh/authorized_keys /home/ssh-user/.ssh/
認証ファイルのオーナーを自分に変更
$ chown ssh-user:ssh-user /home/ssh-user.ssh/authorized_keys
.sshディレクトリを700,認証ファイルを600へ権限変更
$ chmod 700 .ssh/
$ chmod 600 authorized_keys
これでssh-userでssh接続ができるようになる。

また、設定にもよるが、新規ユーザはsudo権限は与えられていない。sudoを実行できるようにするには、root権限になり、/etc/sudoersファイルに下を追加する必要がある。
ssh-user ALL=(ALL) ALL

*あと、sshの公開鍵認証ではなく、パスワード認証にしたい場合は、sshd_confを編集する。このあたりの情報はぐぐればいくらでも出てくる。パスワード認証だと、鍵を指定しないでsshできる。ただ、セキュリティ的にやめたほうがいい。
$ ssh ec2-user@***.***.***.***

・rootのsshログインを禁止する
新規ユーザのみ公開鍵認証、rootでは禁止したい場合、/etc/ssh/sshd_confを下のように編集し、再起動する
- #PermitRootLogin yes
+ PermitRootLogin no
refs:rootでsshログインを禁止する方法
/root/.ssh/authorized_keysファイルを削除しても同様にrootログインできなくなるけど、環境によってはマシンを再起動するとauthorized_keysファイルが復元されているので注意。

・新規ユーザssh-userでもgitでssh接続する
ec2-userのgitリポジトリを丸ごとコピー
# cp -ar /home/ec2-user/hoge.git /home/ssh-user/
所有者、所有グループを変更。-Rでサブディレクトリ内も全て。
# chown -R ssh-user:ssh-user /home/ssh-user/hoge.git
これでクライアントから新規ユーザssh-userでもgit ssh接続ができるようになる。おそらく、
remote.origin.urlの変更が必要になるはず。git-serverはconfigのHost設定
remote.origin.url=ssh://ssh-user@git-server/home/ssh-user/hoge.git

・ec2-userでssh接続をできないようにするには、/home/ec2-user/.ssh/authorized_keysから該当する公開鍵を削除すればいい。ファイル毎削除してもいいが、他の公開鍵の設定している場合は注意する
macのパッケージ管理ツールbrewとmac portsについて。

refs:marvericksをアップデートしたら、rbenvが消えた件

HomeBrewはMacPortsに比べて、依存関係でインストールされるソフトが少ないため、パッケージ管理ソフトで人気が高まっています。
参照
パッケージ管理システムHomeBrew ~ MacPortsとの違いについて

確かに、portの方がインストール時間が凄く長い。最初はbrew、ダメならportにした方が良さそう。

■HomeBrew
brewはinstall時のログを見て解る通り、ソースからビルドしているらしい。./configure,makeとかをしている

brewのインストール済みリストはbrew listで見れる
$ brew list
apple-gcc42        gnupg            libpng            mysql-connector-c    rbenv
autoconf        jbig2dec        libtiff            nkf            rbenv-gem-rehash
cmake            jpeg            little-cms2        node            rbenv-gemset
freetype        jq            memcached        openssl            readline
ghostscript        libevent        mysql            pkg-config        ruby-build

アンインストール
$ brew uninstall jq
インストール
$ brew install jq

検索
 $ brew search  rbenv
rbenv             rbenv-bundler      rbenv-default-gems   rbenv-readline        rbenv-whatis
rbenv-aliases         rbenv-communal-gems  rbenv-gem-rehash     rbenv-use
rbenv-binstubs         rbenv-ctags      rbenv-gemset           rbenv-vars

へるぷ。あとはdoctor,updateあたりを使った
~ $ brew help
Example usage:
  brew [info | home | options ] [FORMULA...]
  brew install FORMULA...
  brew uninstall FORMULA...
  brew search [foo]
  brew list [FORMULA...]
  brew update
  brew upgrade [FORMULA...]
  brew pin/unpin [FORMULA...]

Troubleshooting:
  brew doctor
  brew install -vd FORMULA
  brew [--env | config]

Brewing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]
  open https://github.com/Homebrew/homebrew/wiki/Formula-Cookbook

Further help:
  man brew
  brew home
~ $

パッケージの有効化、無効化
$brew link mysql
$brew unlink mysql

brewの設定一覧
$ brew config
HOMEBREW_VERSION: 0.9.5
~

■MacPorts

refs
MacPortsのインストール方法
Macportの使い方
macのスリープ復帰時に音が聞こえなくなる症状を直すために、osの再インストールしたんだけど、rbenv,home brew,MacPortsの環境が完全にぶっ壊れたのでそのときのメモ。あとmysqlを使えなくなってて再インストールした。
(過去にrbenvをインストールして使っていたんだけど、mac os xを再インストールしたら、rbenvを使えなくなった。)

refs:mavericksをアンインストールしたら、rbenvが消えた件

$ rbenv
-bash: rbenv: command not found

で、消えたのかと思い、brewで再度インストールしたら既にインストールされているというメッセージが・・・
$ brew install rbenv ruby-build
Warning: rbenv-0.4.0 already installed
Error: ruby-build-20140110.1 already installed
To install this version, first `brew unlink ruby-build'
Warning: It appears you have MacPorts or Fink installed.
Software installed with other package managers causes known problems for
Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again.

たしかに残ってはいるようだ・・・
$ brew list rbenv
/usr/local/Cellar/rbenv/0.4.0/bin/ruby-local-exec
/usr/local/Cellar/rbenv/0.4.0/bin/rbenv
/usr/local/Cellar/rbenv/0.4.0/completions/ (2 files)
/usr/local/Cellar/rbenv/0.4.0/libexec/ (25 files)

brew doctorは・・・
$ brew doctor
Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:

    /opt/local/bin/apr-1-config
    /opt/local/bin/apu-1-config
    /opt/local/bin/freetype-config
    /opt/local/bin/gpg-error-config
    /opt/local/bin/krb5-config
    /opt/local/bin/libgcrypt-config
    /opt/local/bin/libpng-config
    /opt/local/bin/libpng16-config
    /opt/local/bin/Magick++-config
    /opt/local/bin/Magick-config
    /opt/local/bin/MagickCore-config
    /opt/local/bin/MagickWand-config
    /opt/local/bin/ncurses5-config
    /opt/local/bin/ncursesw5-config
    /opt/local/bin/pcap-config
    /opt/local/bin/pcre-config
    /opt/local/bin/pkg-config
    /opt/local/bin/python2.7-config
    /opt/local/bin/Wand-config
    /opt/local/bin/xml2-config
    /opt/local/bin/xslt-config

Warning: You have MacPorts or Fink installed:
  /opt/local/bin/port

This can cause trouble. You don't have to uninstall them, but you may want to
temporarily move them out of the way, e.g.

  sudo mv /opt/local ~/macports

Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:

    mysql

Warning: Some installed formula are missing dependencies.
You should `brew install` the missing dependencies:

    brew install freetype

Run `brew missing` for more details.

Warning: You have a non-Homebrew 'pkg-config' in your PATH:
  /opt/local/bin/pkg-config

`./configure` may have problems finding brew-installed packages using
this other pkg-config.


メッセージ通りにgreetypeをインストール
$ brew install freetype

これでもまだ、brew doctroを実行しても色々とメッセージが出る

brew listでインストール済みリストを確認
$ brew list
apple-gcc42        gnupg            libpng            mysql-connector-c    rbenv
autoconf        jbig2dec        libtiff            nkf            rbenv-gem-rehash
cmake            jpeg            little-cms2        node            rbenv-gemset
freetype        jq            memcached        openssl            readline
ghostscript        libevent        mysql            pkg-config        ruby-build
$ brew list
apple-gcc42        gnupg            libpng            mysql-connector-c    rbenv
autoconf        jbig2dec        libtiff            nkf            rbenv-gem-rehash
cmake            jpeg            little-cms2        node            rbenv-gemset
freetype        jq            memcached        openssl            readline
ghostscript        libevent        mysql            pkg-config        ruby-build

rbenvが半端な状態で残っているので、アンインストールしてから再度インストール
$ brew install rbenv
Warning: rbenv-0.4.0 already installed
$ brew uninstall rbenv
Uninstalling /usr/local/Cellar/rbenv/0.4.0...

$ brew install rbenv
==> Downloading https://github.com/sstephenson/rbenv/archive/v0.4.0.tar.gz
######################################################################## 100.0%
==> Caveats
To use Homebrew's directories rather than ~/.rbenv add to your profile:
  export RBENV_ROOT=/usr/local/var/rbenv

To enable shims and autocompletion add to your profile:
  if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
==> Summary
🍺  /usr/local/Cellar/rbenv/0.4.0: 31 files, 152K, built in 3 seconds
$ which rbenv
/usr/local/bin/rbenv
$ rbenv versions
  system
* 2.0.0-p353 (set by /Users/shin/.rbenv/version)

一応直ったか・・・

まだ、rbenv installがない
~ $ rbenv install --list
rbenv: no such command `install'

どうやら、rbenv installを実行するには、rbenv-buildが必要らしい。rbenv listで見るとあるんだけどね・・・これもuninstallしてからinsltallする。

で、rbenvを使っている適当なrubyのwebアプリを実行しようとしたら、mysql2/mysq2がloadできないとかいうエラーが出た。で、gemのmysql,mysql2をアンインストールしてインストールし直そうとしたら、これもできない。

つか、brewのインストール済みのツールが全て使えなくなっていた・・・
~ $  brew list
apple-gcc42        jpeg            mysql            rbenv-gem-rehash
autoconf        jq            mysql-connector-c    rbenv-gemset
cmake            libevent        nkf            readline
freetype        libpng            node            ruby-build
ghostscript        libtiff            openssl
gnupg            little-cms2        pkg-config
jbig2dec        memcached        rbenv
~ $

で、こいつらを1個ずつuninstallしてinstallし直した。当然だけど時間がかかった。。。
その後に、gemでmysql,mysql2をインストールしてみたらできた。rubyのアプリの問題も解決。
apple-gcc42あたりが怪しかった。

あと、macportsも入れ直した。
■ssh接続
gitやec2などのホストに接続する場合に使う。例えばec2の場合。

ssh -i ~/.ssh/hogeKey.pem ec2-user@54.177.○.○

このhogeKey.pemの鍵指定や接続先をIPではなくホスト名にしたい場合、~/.ssh/configに設定を追記しておく必要がある。

$ ssh ec2-user@hogehoge

$ cat ~/.ssh/config
Host hogehoge
User ec2-user
HostName 54.177.○.○
PreferredAuthentications publickey
identityfile ~/.ssh/hogeKey.pem

■sshクライアント、サーバの~/.ssh/の中
クライアント側の~/.ssh/には秘密鍵ir_rdsとかが必要。あと、configファイルとかもある。このconfigファイルはsftp,rsyncでも有効。
サーバ側の~/.ssh/にはauthorized_keysファイルが必要。もちろん、クライアントにもなりうるなら鍵とかも必要。authorized_keysには公開鍵の内容を追記する。行単位で複数設定できる。

■sshのワンラインのコマンド実行
こんなかんじ
$ ssh ec2-user@hogehoge ls -l

■sshのエスケープシーケンス機能

~で始まる。~.が接続の切断とか。~?でへるぷを表示できる

■sshを使ったファイル転送
scpやsftpとか。それぞれrcpやftpを模倣したもの。また、rsync + opensshを併用する方法もある

refs:scp,sftp,rsyncの例

■SSL(Secure Socket Layer)について。

refs book

できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応.../インプレスジャパン
¥2,625
Amazon.co.jp




sslの新しいバージョンはTLS(Transport layer security)という名前で標準化されたため、SSL/TLSといわれる事もある。単にSSLといえば、SSL/TLSの事を指す。

■機能
相互認証。CA(Certificate Authoriy 認証局)を介す。相互認証だけど、サーバ側だけ証明する事が多い。
完全性。改ざんされていないか?電子署名。暗号化で盗聴防止。


OpenSSL。SSLを利用するための必要なソフトウェア。
mod_ssl。OpenSSLを使ってApacheをSSLに対応させるモジュール。

mod_sslは、OpenSSLによりApacheでhttpsを使えるようにするモジュール。mod_sslを使う事でOpenSSLとApacheを連携させることができる。

■CA認証のしくみ

SSL対応のサイトにするときに証明書をCAに発行してもらう。利用者がサイトにアクセスしたら、サイトは証明書をブラウザに返す。ブラウザは自身が持っているCAの情報をもとに、送られた情報が正しいかどうかを確認する。初めてのリクエストでブラウザに登録されていないCAが発行した証明書の場合、ユーザにその証明書を信用するかどうかの確認ダイアログを出す。

このため、まずはCAに自分のサイトを登録し、本物のサイトである事を証明してもらう必要がある。

webサイトの鍵を自分で証明する自己署名という方法がある、自己署名でテスト用の小名称を作れば、CAへの登録をせずにSSL対応のサイトが作れる。が、自己署名ではサーバの認証ができないため、本格運用のときはCAへの登録が必要。

*ってことは、例えば社内で使うようなサイトで暗号化だけが目的なサイトなら自己署名のssl,httpsで十分?


■本格運用

信頼できるサイトにするためにCAに有料で証明書を発行してもらう。主なCAは、ベリサイン、グローバルサイン、サイバートラスト。他にも色々あるけど、違いはただ値段。あとは対応しているブラウザ。マイナーのブラウザには対応していないCaもある。

手順としては、CSR(certificate signing request)ファイルをcaに送る。webサイトの鍵は自己署名で使ったテスト用の鍵でもおっけ。証明書が送られてくる。apacheの場合、この証明書をcsrファイルと同じディレクトリにおき、ssl.confのSSLCertificateFileという項目に証明書のファイル名を設定する。


■自己署名

自己署名を自分のmacでやってみた。結論から言うと、試してみたけどできなかった・・・

apache2 $ pwd
/etc/apache2
apache2 $ ls
extra        magic        original    users
httpd.conf    mime.types    other

・webサーバの鍵を作る
apache2 $ sudo openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
....++++++
..................++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
apache2 $

server.keyファイルができた。

apache2 $ ls
extra        magic        original    server.key
httpd.conf    mime.types    other        users

・証明書をつくる。国、location、ホストとかは適当に入力。

apache2 $ sudo openssl req -new -days 3000 -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:tokyo-dayo
Locality Name (eg, city) []:shibuya-dayo
Organization Name (eg, company) [Internet Widgits Pty Ltd]:hoge company
Organizational Unit Name (eg, section) []:hogehoge unit selection
Common Name (e.g. server FQDN or YOUR name) []:www.example.com
Email Address []:hoge@hoge.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

・server.csrができた。

apache2 $ ls
extra        magic        original    server.csr    users
httpd.conf    mime.types    other        server.key
apache2 $

・テスト用に自己署名する

apache2 $ sudo openssl x509 -req -signkey server.key -days 3000 -in server.csr -out server.crt
Signature ok
subject=/C=JP/ST=tokyo-dayo/L=shibuya-dayo/O=hoge company/OU=hogehoge unit selection/CN=www.example.com/emailAddress=hoge@hoge.com
Getting Private key
Enter pass phrase for server.key:

・このままだとapacheを起動するとパスフレーズを要求されるので、鍵のパスフレーズを解除する。

apache2 $ sudo openssl rsa -in server.key.bak -out server.key
Enter pass phrase for server.key.bak:
writing RSA key
apache2 $ ls


・これでapacheを再起動すれば、httpsでリクエストできるはずなのに、今まで通りhttpでしかアクセスできなかった。なぜだ・・・/etc/apache2/extra/httpd-ssl.conf ファイルの中身をみてもデフォルトのままでいけるはずなのに。ここでギブ


refs
鍵交換方式によりssl接続

■sslとsshの違い
refs:sshやらsslやら

■refs
scpとsftpの違い。軽快なscpか高機能なsftp,sshに向いているのは?

■ssh,scpでファイル転送
sshを使用したファイル転送scpコマンドについて。テスト台としてawsのec2にsshのポートだけ空けておく。また、鍵を~/.ssh/DefaultAWSKey.pemにおいておく。

ローカルのhoge.txtファイルを99.199.○○.○○のec2-userの$HOMEに転送する。鍵はhogeKey.pem
$ scp -i ~/.ssh/hogeKey.pem hoge.txt ec2-user@99.199.○○.○○:

ローカルのhogedirディレクトリを99.199.○○.○○のec2-userの$HOME/testdir/に転送する。
$ scp -i ~/.ssh/hogeKey.pem -rp hogedir/ ec2-user@99.199.○○.○○:testdir/

ただ、間違ったコマンドを実行したときにプロンプトにエラーメッセージも何も表示しなかった・・・

一方、リモートからローカルにファイルを取得する場合。

リモート99.199.○○.○○の$HOME/iii.txtファイルを取得(見づらいけど最後に. ドットがある)
scp -i ~/.ssh/hogeKey.pem ec2-user@99.199.○○.○○:~/iii.txt .

リモート99.199.○○.○○の$HOME/testdirディレクトリを、ローカルの$HOME/tmpディレクトリ下に取得
scp -i ~/.ssh/hogeKey.pem -rp ec2-user@99.199.○○.○○1:~/testdir ~/tmp/

■sshでリモート端末でコマンド実行

リモートのファイル一覧表示
$ scp -i ~/.ssh/hogeKey.pem -rp ec2-user@99.199.○○.○○ ls -l


リモートにファイル作成

$ ssh -i ~/.ssh/hogeKey.pem ec2-user@99.199.○○.○○ touch hoge.txt

リモートにある$HOME/work/test_shシェルを実行する

$ ssh -i ~/.ssh/hogeKey.pem ec2-user@99.199.○○.○○ ./work/test_sh


シェルスクリプトファイルをscp,sftpなどで転送し、そのスクリプトを実行する事も出来る。シェウスクリプと内でsudoでroot権限で実行する場合、-tオプションが必要。
$ ssh -t -i ~/.ssh/hogeKey.pem ec2-user@99.199.○○.○○ ./work/test_sh

■sftpでファイル転送
いんたらくてぃぶに頻繁にファイルをやりとりするなら、sshよりsftpの方が楽。ec2とのやりとりを下に書く(鍵はconfigに設定してある。ホスト名はdefault-ec2にしてある)

・セッション開始
$ sftp ec2-user@default-ec2
Connected to default-ec2.
sftp>

ファイル一覧
sftp> ls -l
移動
sftp> cd hogedir
ファイル取得
sftp> get hoge.tx
ローカルファイル一覧
sftp> lls
ローカルファイルのアップロード
sftp> put aiueo.txt

sftpの他の内部コマンド
ヘルプ
sftp>?
ローカル移動、lcd
ファイル名変更、rename ord new
ファイル削除、rm
パーミッション変更、chmod
めんどくせぇ
lpwd,pwd,mkdir,rmdir

sftpの大きな弱点はディレクトリごと転送できない。大量のファイルを一度に転送する場合、sryncを使う

■rsyncでファイル転送
rsyncは転送元と転送先のファイルを比較し差分を送信する事で、ネットワーク転送料を最小に抑える。従量課金のaws向き
rsync+sshの組み合わせがでふぉ。古いバージョンのrsyncでOpenSSHを使った転送するためには、クライアント側の環境変数RSYNC_RSHをsshにする。具体的には2.6.6以降のバージョンならデフォでsshを使うようになっているから、環境変数を指定する必要はない。
#bash
export RSYNC_RSH=ssh

前提として鍵は設定済み。configでリモートホスト名はdefault-ec2してある。

リモートの$HOME/work/remote.txtを取得
$ rsync ec2-user@default-ec2:work/remote.txt .
リモートの$HOME/work/remote.txtを取得して、ローカルのtodirに保存
$ rsync ec2-user@default-ec2:work/remote.txt todir/
リモートの$HOME/work/test_remote_dirディレクトリを取得して、ローカルのtodirディレクトリに保存する。-rはリカーシブル、-aはアーカイブモード
$ rsync -a -r ec2-user@default-ec2:work/test_remote_dir todir/

リモートの$HOME/workディレクトリをローカルのworkディレクトリと同期させる。
$ rsync -a ec2-user@default-ec2:work/ work/
-aはディレクトリの再帰的な転送を可能にするもので、同時にパーミッションや更新日時、シンボリックリンクも正しく複製する。これがアーカイブモード?

ちなみに、-uは更新モード。より新しいファイルが転送先にある場合、そのファイルを転送しない。-bはバックアップモード。転送先のファイルを上書きする場合、古いファイルのバックアップを作成する。

今度はローカル環境からの転送。

ローカル環境のlocal.txtをリモートのworkディレクトリ下に転送
$ rsync local.txt ec2-user@default-ec2:work
ローカル環境のtestdirディレクトリをリモートのworkディレクトリ下に転送
$ rsync -a testdir ec2-user@default-ec2:work

-vは冗長モード、-zは圧縮をしよう、-e "コマンド"は、sshの代わりに実行するコマンドを指定する