ARCHIVESDRIVE HB

オイラはホームベーカリー!

CentOS5 以前ではもう github に接続できない

書こうと思ってて忘れてたやつ。

Github に接続できない

github にリクエストを送るとこうなる。

[user@oldhost ~]$ ssh -T git@github.com
no kex alg

古いアルゴリズムがサポートされなくなった

githubengineering.com

github 君は「前々から告知してたよなぁ……?」という体で、それは正しいんじゃがワイも「気付いてなかった、そんなの……」状態であった。

具体的にどうなのか

これだけだとよくわかんねぇな?ってなると思いますが、要は CentOS5 以前の環境では OpenSSL が古いので、新しい TLS をサポートしてなく、 github と通信できなくなりました。 CentOS6 も OpenSSL をアップデートしてないと多分通信できません。最新版まで上げてあれば大丈夫。 OpenSSL 1.0.0 のいくつ位があれば大丈夫だったかは失念しましたね……。

確認方法

以下のようにコマンド叩いて、 error が返って来なければ大丈夫です。

オッケーなパターンもだいぶ OpenSSL 古くないか?!ってご指摘があるかと思いますが、手元の検証用環境なんで許してクレメンス。

CentOS 5 + OpenSSL 0.9.8l

だめなパターン

[USER@localhost ~]$ openssl version
OpenSSL 0.9.8l 5 Nov 2009

[USER@localhost ~]$ openssl s_client -connect github.com:443
CONNECTED(00000003)
24290:error:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1 alert protocol version:s3_pkt.c:1061:SSL alert number 70
24290:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:530:

CentOS 6 + OpenSSL 1.0.1e-fips

オッケーなパターン

[USER@localhost ~]$ openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

[USER@localhost ~]$ openssl s_client -connect github.com:443
CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 Extended Validation Server CA
verify return:1
depth=0 businessCategory = Private Organization, 1.3.6.1.4.1.311.60.2.1.3 = US, 1.3.6.1.4.1.311.60.2.1.2 = Delaware, serialNumber = 5157550, C = US, ST = California, L = San Francisco, O = "GitHub, Inc.", CN = github.com
verify return:1

# snip #

どうする

OpenSSL をアップデートするか、環境を投げ捨てるのが一番です。

とはいえそうそうすぐに捨てられない人もいるでしょう。 その場合は、自分のローカルに適応したい環境と同じプロジェクトを持っておき、毎回差分のあるファイルを zip なりで scp するのが良いでしょう。 rsync も考えたけど、本番とローカルじゃ多分値変わるからね……。

EC2 インスタンスの時間が変更できない

つっても、多分みんなは「ずれてるの直したい!」だと思うんですよね。僕は、「anacron の動作テストしたいから、AmazonLinux2 の正常な時間をずらじだい!」だったんですが。

timedatectl などしてみても、再起動するとlocaltime とかで設定した時間に戻ってしまって「ウッォオオアウァー!(┐「ε:)」って感じだったのですが、以下をみて納得しました。

https://forums.aws.amazon.com/thread.jspa?threadID=159885

EC2 インスタンスを Stop/Start すると仮想ハードウェア クロックが再作成されるため、正しい時刻が設定されます。

なるほどー。

GA-Z170X-UD3 を使うときに注意すること

三枚くらい CPU ピン折って、表題のマザーボードに落ち着いたのですが、使ってるうちにいくつか問題に遭遇したのでその解決策を。

スリープを選択しても、画面反転後にすぐログイン画面が立ち上がる

下に同じ。

シャットダウンしても勝手に再起動される

イーサネットSNMP 有効で PoE を検出しているのが原因です。

よく職場で徹夜せざるを得ない状況になるので「Wake on LAN 有効にして、自宅からリモートデスクトップしたろ!」と思って、LAN ドライバインストール時に、 ドライバ以外に SNMP 関連の機能をすべてインストールしていました。 そのため、自宅ネットワーク内のなんかの通信を受け取っていたようで、シャットダウンしても即座に起動していたようです。 結局メリットよりもデメリットが勝ったのと、やばそうなときは PC つけっぱなしにして外出すればいいね!という事で解決を図りました。 Wake on LAN が有効かどうかは、以下のあたりをご参照ください。 www.zu-min.com

( BD | DVD | CD ) ドライブを認識しない

S-ATA ケーブルの接続先を変えてみてください。

いまだに OS のインストールメディアは CD か DVD を信用している派です。 この前置きは結構重要で、つまり OS インストール時には光学メディアのドライブを利用できていたんですね。で、いつごろかは観測できていないけれど、光学メディアのドライブが認識できなくなった、と。 OS インストール直後のチップセットドライバインストールなどは光学メディア経由のため、おそらく Windows Update で、 1511 を適用したあたりじゃないかなあ、と思います。 で、とりあえずレジストリを修正すれば治るよ、ということで、以下を試してみました。

Windows 10がDVDを認識しない、光学ドライブが消えた場合の対処方法 - ぼくんちのTV 別館

いずれもレジストリ編集後再起動しても認識されませんでした。ちなみに、上記の作業前・作業後、いずれも UEFI ( BIOS ) 上では、光学ドライブを認識できている状態でした。 S-ATA -> USB 変換ケーブルを利用して動作確認した際には、光学メディアを読み込める状態でした。なおかつ、内蔵 S-ATA 利用時には、ドライブの eject ボタンを押すとトレイが排出されてくるので、通電を確認できている状態でした。 結局以下の記事を観て「まっさかー」となりながら、順番に S-ATA のポートを差し替えていったら認識したので真顔になりました。

apicodes.hatenablog.com

変更前は、

  • SATA 2
    • BD ドライブ
  • SATA 3
    • SSD ( 起動用 )
  • SATA 4
    • データ用 HDD
  • SATA 5
    • データ用 HDD

だったのですが、順番に変更していき、以下のようにした所。認識されました。

  • SATA 3
    • SSD ( 起動用 )
  • SATA 4
    • データ用 HDD
  • SATA 0
    • データ用 HDD
  • SATA 5
    • BD ドライブ

意味がわかんねえな?とはいえ、困った人は順番に付け替えてみてください。ちなみに SATA n みたいなポートの数字は、公式ページに転がっているマニュアルの P15 7) SATA3 0/1/2/3/4/5 ( SATA 6Gb/sコネクター ) の表記を参考にしています。

f:id:donbulinux:20180504001920p:plain

その後

スリープから復帰すると SATA 0 のハードディスクと SATA 5 の BD ドライブを認識しなくなる問題がある。 うーん困ったなこれ。サポートに投げてみっか!

mac を選ぶ理由

gigazine.net

別にシャレオツだからとかそういう理由はどうでもよくて、

  • ぶっ壊れたときそのへんの大きな店に行けば即座に代替品が手に入る
  • ハードウェア手がけてる会社がソフトウェアメンテナンスしてる
  • ソフトウェア手がけてる会社がハードウェアメンテナンスしてる
  • お値段 15 万円前後で、適度なスペックで重量 2kg 以下を保持している ( ノート型筐体のお話ね )
  • LinuxUnix ベースのオペレーティングシステムを積んでる
  • 本体価格の二割位詰めば手厚いサポートがある

っていう。 そんなもん VirtualBox や Docker でええやろって意見もあるけど、一般に広く実用できるようになった(利用の障壁が下がったように感じる)のここ数年じゃないすか、って感じですし。

なんだかんだ言って、ゆりかごから墓場まで感提供してくれるから、おつよく便利に使えるって感じ。 Docker 大分 Windows に優しくなったし Windows 10 は bash 使えるようになったし、ここ最近のソフトウェア環境だったら、 Surface とかでも全然いいとは思います。

という、読んで思ったアレ。 やっぱ開発しない人は、ガワのかっこよさとか優先するんすかね? (新型 MacbookAir はよはよ)

Capistrano3 で複数のデプロイ先を設定する

といっても、 config/deploy/production.rb に複数 server を書いて、物理的に別のサーバにデプロイする、とかいうやつじゃないです。

複数の deploy_to を設定する

これ、1つのサーバに複数のデプロイ先を用意します。

どういう時に必要かというと、1ソースの中でコンフィグによって出し分けをしていたりする場合ですね。コアは共有してるけど、コンフィグの値によって表示する view が違う(分けることができる)場合とか。んで、コンフィグ違いによってサブドメインを分けて複数サイトを運用している場合。具体的に言うと以下みたいにしたい感じ。

└┬ /var/
 └┬ /www/
  └┬ /AppRoot/
   ├┬ /config-a/
   │└─ /current/
   └┬ /config-b/
    └─ /current/

production staging でそれぞれ * /var/www/AppRoot/config-a/current/ * /var/www/AppRoot/config-b/current/ にデプロイした、合計 4 環境作りたい、と。

どうする

Capistrano2 までなら、起動時のコマンドに -S 引数 とすることで引数がつけれたようですが、 Capistrano3 では廃止されたようです。 代わりに環境変数を設定するようにして、 config/deploy.rb 内で、その環境変数を読み取り利用します。

具体的にはこう

config/deploy.rb

case ENV['CONFIG_TYPE']
when "config-a"
  set :deploy_to, "/var/www/AppRoot/config-a/"
when "config-b"
  set :deploy_to, "/var/www/AppRoot/config-b/"
else
  print ("有効な CONFIG_TYPE= を指定してください")
  exit!
end

bundle exec cap (staging|production) deploy CONFIG_TYPE=(config-a|config-b) と実行します。

デプロイ先の指定には、 RALIS_ENV= 的なノリで指定するようにしました。

期待した値となる、 config-a config-b が入っていない場合は「有効な CONFIG_TYPE= を指定してください」と表示して終了します。

そうそう必要になる人はおらんじゃろ!って感じですが、調べても簡単にやる方法が出てこなかったので、バッドっぽいノウハウとしてお納め頂ければ。

Slack はとりあえず絵文字をぶっこめ

年明けからリモートワークが導入されました。といってもコーダかつ SES 受託受けてるみたいなプレイヤーの人たちが対象で、一次対応の人員は物理オフィスに毎日集合!といった従来からのワークスタイルです。

で、今日この辺の記事で読んで「ふむ!」と思ったので、一つ心がけている事を。

とにかくリアクションをつけまくる

これ。

Slack でやりとりしてるとテキストだけなので感情がわかんねえな!というのはリンク先でもおっさってる通りで、じゃあどうする→ emoji で解決や!というのは実際わりと有効です。

  • とりあえず悩んだら thinking_face
  • お願いする時は bow
  • 肯定するときは ok_woman ok_man ok_hand
  • 「マージできたよ!」みたいな小規模のうれしみには clap
  • 「リリースでけた!」みたいな大きめのうれしみには tada
  • 「コンフリクトした……」みたいなかなしみには joy sob scream
  • お客さんから無茶苦茶いわれて「そんなぁ」みたいなお気持ち表明には face_vomiting
  • めっちゃ詰まって「ぼすけて!」みたいなお気持ち表明には party_hard のような gif をカスタムアイコン登録!
    • (めっちゃピカピカするのでヤメろぉ!というお気持ち表明されたらやめようね!)

自分で利用しているのは主にこのあたりです。 あとはビールのアイコンでお気持ち表明したり、包丁を構えた三代目のアイコンで「?」というお気持ちを表明したり。 やりすぎると「うぜぇ!」と言われますが、「○○終わりました!」→無反応、だとわりかし不安になるので、テキストでなくても何かしら反応をかえしてあげるといいね、というお気持ちです。 特にこれからの時期、新社会人など新しく参加してくるひとなど、言葉でフォローすると返事されてめんどいけど放置するのもナ……、と思ったら、 emoji だけでも付けてあげるとよいと思います!

追記

ザ・マンの「私はいいと思う」の画像は汎用性がめっちゃ高いので、一枚はピクチャフォルダに忍ばせておくのをオススメします。

Apache でリバースプロキシしてカジュアルに Basic 認証

ネットワーク環境の更新により、社内ネットワークで動作させていた検証環境を VMimport で AWS に出したのですが、冷静に考えて認証もなしにインターネットに解き放つとは……という感じなので、ついでに Basic 認証をつけました。というお話。

ロケ地:CentOS 6.8 / Apache 2.2 / webrick

単一インスタンスに複数の環境

大分古い Rails アプリケーション( 環境が webrick のあたりで… ) が複数動いている環境があり、ポートを 3001 から順番に付与して動作させておりました。社内ネットワークであれば FW の内側なので、認証もクソも考えること無く http://192.168.0.100:3001 とかでアクセスさせれば良いのですが、インターネットに解き放つとなると話は別です。

そもそも検証環境なので、サーチエンジンにクローリングされて本番と混同されたらマズいよね robots.txt 書こうねとか、振る舞いのよくないクローラに拾われても被害が最小限になるように認証かけとこうね?みたいな話ですね。

最初は特に考えず pound を利用していた

どうせアクセスしてくるユーザも限られるし Pound でいいか!ってお気持ちで以下のような config で Pound 投入しておりました。

pound.cfg

User        "nobody"
Group       "nobody"
LogLevel    1
Alive       10
Daemon      1
LogFacility local1

ListenHTTP
    Address    0.0.0.0
    Port       80

  Service
    HeadRequire "Host: web1.example.com"
    BackEnd
        Address 127.0.0.1
        Port    3001
        TimeOut 60
    End
  End

  Service
    HeadRequire "Host: web2.example.com"
    BackEnd
        Address 127.0.0.1
        Port    3002
        TimeOut 60
    End
  End

  Service
    HeadRequire "Host: web3.example.com"
    BackEnd
        Address 127.0.0.1
        Port    3003
        TimeOut 60
    End
  End
End

認証ないのはだめでは?認証いれよ!

環境の都合上、 any にウェルカム!なのはよくないので、 Basic 認証を入れることにしました。しかし Rails アプリケーションは public/.htaccess などを設置してお手軽に Basic 認証できません。そら authenticate_or_request_with_http_basic とか書けばいいけど、検証環境なので勝手にコードに手を入れるのはね?というお気持ち。 なので、入れた Pound を捨てて Apache をご利用します。今回は環境分ドメインが存在しているため、簡単に書けるネームベースの VirtualHost に個別でリバースプロキシと Basic 認証の設定を書きました。

yum install httpd httpd-devel apr apr-util
htpasswd -c /etc/httpd/htpasswd basic
vi /etc/httpd/conf/httpd.conf
/etc/init.d/httpd start

httpd.conf

## snip ##

Listen 80
NameVirtualHost *:80

<VirtualHost *:80>
  ServerName web1.example.com
  ProxyPass / http://127.0.0.1:3001/
  ProxyPassReverse / http://127.0.0.1:3001/
  <Location "/">
    AuthType Basic
    AuthName "Basic Authentication"
    AuthUserFile /etc/httpd/htpasswd
    Require user basic
  </Location>
</VirtualHost>

<VirtualHost *:80>
  ServerName web2.example.com
  ProxyPass / http://127.0.0.1:3002/
  ProxyPassReverse / http://127.0.0.1:3002//
  <Location "/">
    AuthType Basic
    AuthName "Basic Authentication"
    AuthUserFile /etc/httpd/htpasswd
    Require user basic
  </Location>
</VirtualHost>

<VirtualHost *:80>
  ServerName web3.example.com
  ProxyPass / http://127.0.0.1:3003/
  ProxyPassReverse / http://127.0.0.1:3003/
  <Location "/">
    AuthType Basic
    AuthName "Basic Authentication"
    AuthUserFile /etc/httpd/htpasswd
    Require user basic
  </Location>
</VirtualHost>

おしまい

これで Rails アプリケーション部分に手を加えることなく、Apache のみでリバースプロキシと Basic 認証を導入することができました。ベストかどうかはわからんけど、 Production 環境でなければままえあろって感じです。