それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Debian/ubuntu のapt自動アップデートのUnattendedUpgradesを設定する

Debian の apt 更新がめんどくさいのでなんとかする。

昔は cron-apt でやってたけど、今時はどうするのかなーと思って調べてたらUnattendedUpgradesがあったのでコレを設定することに。

Debian Wikiに従ってインストール

sudo apt install unattended-upgrades apt-listchanges

apt-listchanges は無くても良さそう。apt-listchangesはメールで更新の通知をするツール。

アップグレードを有効にする。

sudo -e /etc/apt/apt.conf.d/20auto-upgrades

定期的にアップグレードとパッケージリストの更新を有効にする。

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

更新するパッケージの指定と外すものはここで設定できる

takuya@orangepizero:~$ cat  /etc/apt/apt.conf.d/50unattended-upgrades | head
// Unattended-Upgrade::Origins-Pattern controls which packages are
// upgraded.
//
// Lines below have the format format is "keyword=value,...".  A
// package will be upgraded only if the values in its metadata match
// all the supplied keywords in a line.  (In other words, omitted
// keywords are wild cards.) The keywords originate from the Release
// file, but several aliases are accepted.  The accepted keywords are:
//   a,archive,suite (eg, "stable")
//   c,component     (eg, "main", "crontrib", "non-free")

設定が不安なら dpkg-recongfigure でも出来る

sudo dpkg-reconfigure -plow unattended-upgrades

no を選ぶと、/etc などのファイル更新でどっちを優先するか決められる。

f:id:takuya_1st:20170316004953p:plain:w200

設定ファイル更新されるの嫌だから、ローカル優先しておいた。

f:id:takuya_1st:20170316005041p:plain:w200

もし更新するパッケージを指定するなら

以下のファイルにアレコレ書いて、更新するパッケージを指定する。 デフォルトで大丈夫だと思うのですが。更新したら動かなくなる野良ビルドドライバとか入ってたら linux-header とかカーネルの更新は避けたいところだったりする。

sudo -e /etc/apt/apt.conf.d/50unattended-upgrades

参考資料

web.archive.org のURLを考える

web.archive.org のURLはどうなってるのかを見てみる

web.archive.org のインターネットアーカイブがとても便利。

著作権云々だとかで魚拓サービスはとても使いにくいので、アーカイブから取るのが良い。

基本的なURL

基本的はURLは日付+取得したいURLになってる

たとえばヤフオクの 20170225084900 のデータを見たい場合

http://web.archive.org/web/20170225084900/http://auctions.yahoo.co.jp/

日付の指定を省略して、どの日付のアーカイブがあるか調べる

http://web.archive.org/web/*/http://auctions.yahoo.co.jp/
http://web.archive.org/web/http://auctions.yahoo.co.jp/ # または

特定月の最新版を取りたい

日付を省略すれば、その月の最新版の付近が取れる。

http://web.archive.org/web/201303/http://auctions.yahoo.co.jp/

特定年の最新版を取りたい

月日を省略すれば、その年の最新版の付近が取れる。

http://web.archive.org/web/2013/http://auctions.yahoo.co.jp/

取り敢えずこの辺ください

存在しなくてもその前後の日付で、アーカイブが存在する一番近い日付にリダイレクトしてくれる。

## あるかないか知らないけど、20130315 のデータくださいってリクエスト
http://web.archive.org/web/20130315/http://auctions.yahoo.co.jp/

画像があるの?

画像も同じようにURLを指定すれば取れると思う。

http://web.archive.org/web/20040610050213/http://example.com/sample.jpg

ただし、ページに埋まってる画像は次のようなURLで取得されることになる。

## 20040610050213のhttp://example.comが存在する場合で、その中に埋まってる画像のURL
http://web.archive.org/web/20040610050213_im/http://example.com/sample.jpg

なんなら、FLVとかもあったりする。

InternetArchive は大切にしたいプロジェクト。

InternetArchiveのwayback machine はいざという時に貴重。

WebArchiveプロジェクトは、ストレージや転送量が大変なプロジェクトだとおもう。でもとても救われることが多い。

なので少しばかり応援してさせていただいた。

バックエンドへのssh のユーザー名で接続先を振り分ける

ssh でフロントとバックエンドへの接続を簡単にしたい。

ssh でIP浪費するのもめんどくさい話だし。

バックエンドへの接続をもう少し楽にできたら良いんだけど。

ユーザー名でバックエンドへの接続を切り分ける

発想としていくつかある。

フロント┬────── Backend 0
    ├────── Backend 1
    └────── Backend 2

フロント側にアレコレする

フロントにSSHログインする場合:踏み台経由の多段ログイン

  • authorized_keys をつかう
  • /etc/sshd/sshd_config を使う
  • LDAPなどを使う

sshd_config を使う場合

sshd_config の Match を使ってフォワードする。

Match user takuya
    ForceCommand ssh -t backend-host

authorized_keys を使う場合

authorized_keys に登録する公開鍵に次のように書く。

Command ssh -t backend-host ssh-rsa AAAAAAAAAAAA

LDAPを使う。

LDAPの認証エントリに sshd_config/authorized_keys と同等のこと記述したらいい。

2回の認証を省略したい。

そもそも認証状態を転送できないのか? LDAPを使えばワンちゃん。Backend側がフロント側のPAMに聞きに行けばいいんだけど、依存関係が増えてもうめんどくさい。

ポート転送をかける:転送分だけポートが必要

  • フロント:2201 を Backend01 22
  • フロント:2202 を Backend02 22

すぐに思いつくのはポートフォワード。でもVhostに振り分けたいって要望がある時点で、ポートを開けたりIPを触りたくない前提があるわけだから、此の解決策は手軽なゆえに、多くの人は規制により使えないことが多いと思う。

NFSでマウント:ファイルを編集するだけなら

  1. NFSでフロント側からBackendをつなぐ
  2. Backendにはログインしない。
  3. 主にファイル編集だけなら有用
  4. ChrootDirectory と組み合わせて戦える
  5. 同一ホスト内のLXCならなおさら有効?

NFS マウント/Chroot 

BackendがLXCで同一ホスト内なら、SSHログイン後の Chroot Directory や Home をアレコレすることでなんとかなる。

実はこれは意外とオススメ。NFSでマウントして触らせておくのはバックエンドサーバーのプロセスをそのまま触られないので結構バランスする。

Chroot設定。

Match Group sftpuser
  ChrootDirectory /var/backend/01

NFS マウント

sudo mount Backend01:/var/www /var/backend/01

もしくは、これらのマウントを sshfs で起動するスクリプトをログイン(bashrc/sshd_config/authorize_keys)に仕込めばいい。

リバースプロキシ

sshpiperd が使えるらしい

クライアント側で操作する。

クライアント側で -t オプションを付ける

クライアント側でバックエンドへの転送を、フロント側のSSHサーバーに指定をする。

ssh front-host -t ssh  backend-host

クライアント側のconfig で -W オプションをつける

.ssh/config

Host backend
  Hostname backend
  Port 22
  ProxyCommand ssh -W %h:%p frontend

ポート転送を掛ける

ポート転送をしてフロント側とバックエンドへの接続用に、フロント側にポートを開ける。

  • ssh のフォワード
  • iptables - iproute2 / ip route 

などで指定すればいけそう。

その他使える設定ファイル。

  • ForceCommand
  • ~/.ssh/environment
  •  ~/.ssh/rc
  • /etc/ssh/sshrc

その他の解決方法

今回はネットワークの3レイヤあたりは余り考慮せず7レイヤをメインで考慮したのでこれらの解決策は余り検討しなかった。

  • SSL で CONNECT でSocksプロキシを使う
  • stunnel を使う
  • openVPNを使う
  • ssh/tun-tap を使う。

SNI出来ないの?

OpenSSHの此のスレッドのこの辺り(Name based SSH proxy )で議論されてる。

I hope we do not introduce a cleartext SNI into the SSH protocol. This leaks far too much sensitive metadata for passive monitors. TLS has cleartext SNI, and it is quite difficult to figure out how to protect it from passive monitors

やろうと思えば出来るけど、SSHプロトコルにないもんを作るのはSSHプロトコルの定義からの見直しになりそうだし、そもそもSNIはクリアテキストになってんじゃないの?そんなの実装したくねーわって丁寧な言葉で書かれてる。たぶんコレが全て答え。そのため、どうしてもやりたいなら stunnel を使う必要がある。

参考資料

https://www.infiniteloop.co.jp/blog/2016/05/user-namebase-ssh-reverse-proxy/

http://hogem.hatenablog.com/entry/2015/06/08/233000

https://github.com/tg123/sshpiper

http://yudai.arielworks.com/memo/2010/12/15/225715

http://tsuchinoko.dmmlabs.com/?p=1387

Name based SSH proxy