それマグで!

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

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

Google Chrome / Apple Safari は 301 リダイレクトやHSTSをずっと保存する!?

301/302 のどっちが良いか調べてて気になった。

HTTS ステータスコード 301 でリダイレクトしたら、その転送結果がキャッシュされて、リダイレクト後に戻ってこれない。

301 のリダイレクトがずっと残るので気になってた。

https://stackoverflow.com/questions/9130422/how-long-do-browsers-cache-http-301s

At least two browsers - Chrome and Firefox - will cache a 301 redirect with no expiry date
FirefoxとChromeの2つに限れば、リダイレクト情報保存に期限はない。
Chrome caches the 301 redirect infinitely, or until you open your DevTools, check Disable cache (while DevTools is open), and reload the page.

などと書いてあって、ステータスコード301はリダイレクトで乱用すると、キャッシュで面倒なことになりそう。

いちおう、キャッシュさせないように Cache-control でも制御できるみたい。 まぁ301を使うことは、サイト移転以外にあまりないと思うんけど、知って損にはならなさそう。

HSTSはどうなのか

HSTS もリダイレクトがキャッシュされて、開発中にSSLでトラブったり切替え時にアレコレすると、わりと面倒なことになる。

コッチも調べてみたら、有効期限を秒数で指定できるようでした。

Strict-Transport-Security:max-age=$int;includeSubDomains

nginx で サイトを認証を手軽にログインフォーム認証にする。(Basic認証の代わり)

nginx で サイトを認証する。

Basic認証だと不便なので、フォーム認証をする。

巷に「nginxでbasic認証してみた」の記事が溢れているけど。どう考えてもbasic認証(digest認証)よりHTTP認証(フォーム)のほうがいいと思うんですよね。nginxだけで片付くのになんでやらないんだろう。

nginx の auth_request を使う。

auth_requestで、認証が出来る。

  • 認証済みの場合は、指定したURLをそのまま見せる
  • 未認証の場合は、認証用のページに飛ばす。
  • 認証ページが、401/403 を返せば未認証に
  • 認証ページが、200(20x)を返せば認証済みに。

要は、認証ページを指定して403 / 200 を返す。

簡単!!!!

それだけ。超簡単。

ログインフォームに転送するには nginx で 401 エラーページを指定する

もしかしたらBasic/Digest認証を設定するよりもっと簡単で使いやすいのでは。

設定はこれだけ

auth_request /auth_checker.php;
error_page 401 =301  https://$host/form.php?orig=$uri&$query_string;
auth_request  セッションチェックURL

上記のこれで、ユーザの認証状況を確認する。

error_page 401 =302  ログインフォームURL

上記のこれで、401が来たら、302 でリダイレクトに変換して、認証ページへ飛ばしてる。

認証取得ページで、認証完了後に元のURLへ再度リダイレクトをするために、LOGIN_URL?orig=$uri&$query_string で認証ページに元のリクエストページを保存している。

認証チェックの例

認証チェックは、セッションなどを見て、200 / 402 をチェックすればいい 使い方によっては、IPアドレスでチェックしたり、Oauthなどもできそうですよね。

例 auth_checker.php

<?php
if ( empty($_COOKIE) ){
     //do something for cookie
}
session_start();
if ( !empty($_SESSION['is_login']) ) {
  http_response_code(200);
  return ;
}else{
  http_response_code(401);
  return ;
}

特定のディレクトリにだけ認証をかけたい場合

location /path/to/秘密 {

    auth_request /auth_checker.php;
    error_page 401 =302  https://$host/form.php?orig=$uri&$query_string;
}

未認証のときは、単に見せない(ログイン者だけ画像が見えるなど)であれば、 error_pageのリダイレクトは無くても良い。

個人的には歓喜した。

Apacheディレクトリの一覧に保護を掛けるのが楽。 Basic認証だとiOSがパスワードを学習しないので不便なのでした。

認証を作るのが面倒くさいので、割とコレで自分ファイルにロックを掛けるだけなら、手軽でいいなとおもいます。

ファイルの共有程度に、NextCloudいれたりGoogleDrive契約するのも面倒くさい話だし。

参考資料

http://nginx.org/en/docs/http/ngx_http_auth_request_module.html

2018-05-09 更新

リダイレクトには、301 より 302 の方が良さそう。Chromeが301 リダイレクトを学習してキャッシュしてしまう。

phpで指定した日付の範囲を作り月末にも対応させる

php の日付範囲を求めるにはDatePeriodを使うと便利

DatePeriod にスタートと、終了、そして間隔を追加すると日付範囲のオブジェクトが出来る。

<?php
#(PHP 5 >= 5.3.0, PHP 7)
DatePeriod implements Traversable {

DatePeriodは Traversable なので、foreach などに入る配列オブジェクトとして扱える。

日付範囲を扱う

<?php

function date_range($start='yesterday', $days='+31 days') {

    $begin = new DateTime( $start );
    $end = new DateTime( $days );

    $interval = new DateInterval('P1D');
    $date_range = new DatePeriod($begin, $interval ,$end);
    return $date_range;
}

ループで回せるように range の変わる date_range を試しに作ってみた。

実例

<?php

$sday = date('Y-m-01', strtotime('this month '));  // 05-01 
$eday = date('Y-m-01', strtotime('next month '));   // 06-01 

foreach( date_range($sday, $eday) as $day ){
  echo $day->format('Y-m-d')."\n";
}

出力例

2018-05-01
2018-05-02
2018-05-03
(略
2018-05-29
2018-05-30
2018-05-31

ポイント

ループで回すときに、最終日の1日先を指定するのがポイント

DatePeriod は指定した終了時刻未満を配列に返すので、注意が必要。

参考資料

aptで入れたcertbot にhttpd 壊されたので注意のために記事書いた

証明書の管理をcertbot にまかせていました。

lets encrypt が一般化し、ChromeHTTPSを標準化してHSTSを覚えるようになってきて、HTTPS化の流れは避けられない。

さらにあれから2年がたつ、以前はcertbot が手軽に使えるので、証明書の管理に使ってた。

certbot のインストールと証明書の取得。

インストール

sudo  apt install certbot

取得

sudo certbot  certonly  -d takuya.example.com

nginx と apache2 がダウンする事態が発生。

こうやって運用を初めて2ヶ月たった、ある日、apacheが死んでることが発覚。すぐに再起動して事なきを得た。 しかし、数時間後に再びダウンする。エラーログを調べてもわからない。

nginxに切替えてみた。しかし再び毎日ダウンする自体になり頭を抱えていた。

apt で入れたcertbot はサービスを伴う。

攻撃でも食らってるのかとDoSを疑ったり、アクセスログやサーバーのログを調べているうちに気付いた。

これ certbot が自動更新で落ちてる。。。。

disableをして事なきを得た

takuya@:~$ sudo systemctl  disable   certbot.service
takuya@:~$ sudo systemctl  disable  certbot.timer

systemd に登録された certbot のサービス

certbot を apt で入れた場合に、次の自動更新のサービスが展開される。

そう、certbotのせいだった。

この自動更新の動作が、apache/nginxを停止し、証明書の更新用に起動して失敗して放置し、そのままnginx/ apache が停止したままになるのだ。

それも数時間おきに。

takuya@:~$ sudo systemctl  status  certbot.timer
● certbot.timer - Run certbot twice daily
   Loaded: loaded (/lib/systemd/system/certbot.timer; disabled; vendor preset: enabled)
   Active: active (waiting) since Tue 2018-05-01 13:17:46 JST; 2 days ago
takuya@:~$ sudo systemctl  status  certbot.service
● certbot.service - Certbot
   Loaded: loaded (/lib/systemd/system/certbot.service; static; vendor preset: enabled)
   Active: inactive (dead) since Thu 2018-05-03 12:19:42 JST; 6h ago
     Docs: file:///usr/share/doc/python-certbot-doc/html/index.html
           https://letsencrypt.readthedocs.io/en/latest/
  Process: 30575 ExecStart=/usr/bin/certbot -q renew (code=exited, status=0/SUCCESS)
 Main PID: 30575 (code=exited, status=0/SUCCESS)
      CPU: 545ms

 5月 03 12:19:41 myhost systemd[1]: Starting Certbot...
 5月 03 12:19:42 myhost systemd[1]: Started Certbot.

しかし、certbotは80/443 に直接アクセスが出来ない。

私はiptables でポートを変えててマッピングしてたり、リバースプロキシを挟んでいるので、certbot の自動更新は動作しない。

そのために、毎月手作業で更新していたのだが、それすらめんどくさくなってCDNHTTPSを利用している。つまりcertbot はインストールしたまま放置してたのだ。

そして、事件は起きてしまった。

certbot が証明書を自動更新しようとしてapache/nginxの設定を書き換えて死んでいく。

そのためにHTTPのアクセスはHTTPSにリダイレクトされるようにされているしもうめちゃくちゃ。。

apt の certbot は怖い。

  • http → httpsのリダイレクトを書き加えられる
  • certbot の sytemd タイマーが定期的に動作してくる
  • certbothttpd のプロセスを利用して更新を試み失敗したまま放置

割と面倒くさい。

自動更新が動作しない環境であれば、certbot を apt で入れるべきではないのかもしれない。

2018-07-23 追加

https のサービスをいったん止めて再起動させればいい感じかもしれない

/lib/systemd/system/certbot.timer  にタイマーの記述

takuya@:~$ cat  /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=3600
Persistent=true

[Install]
WantedBy=timers.target

/lib/systemd/system/certbot.service にコマンドの記述

takuya@:~$ cat  /lib/systemd/system/certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
#ExecStart=/usr/bin/certbot -q renew
ExecStart=certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
PrivateTmp=true

systemdを再設定 .

sudo systemctl daemon-reload
sudo systemctl  status  certbot.service
sudo systemctl  status  certbot.timer

sudo systemctl  start certbot.service

sudo systemctl  status  certbot.service
sudo systemctl  status  certbot.timer

しばらく様子を見る

2018-08-07

crontab にした

* */12 * * * bash -c ' { systemctl stop apache2 nginx ; certbot -q renew; systemctl start apache2 nginx; }'

2018-08-07 systemd の記述を修正

reload の順番がおかしかったので修正

grep でシンボリック・リンクのファイルとディレクトリを無視する

grepすると終わらねぇ

遭遇した問題 。Grepでファイルを検索したら再帰的に無限ループになって検索が終わらない。

ディレクトリのリンクをたどってそれがまた次のディレクトリをたどって、永遠にループする。

シンボリック・リンクを無視する

どうすればいいか。ぐぐってみたら

grep -r を使う

これを書くことでリンクを辿らなくなる。マジカ

再帰的に検索。

man には書いてない。。。

       -R, -r, --recursive
              各ディレクトリの下にあるすべてのファイルを再帰的に読み込みます。 これは -d recurse オプションと等価です。

UbuntuLinux man-JP を読んでも書いてないんだけど.

GNU の最新版のman をんだら書いてあった

       -R, --dereference-recursive
              Read all files under each directory, recursively.  Follow all symbolic links, unlike -r.

       -r, --recursive
              Read all files under each directory, recursively, following symbolic links only if they are on
              the command line.  Note that if no file operand is given, grep searches the working directory.
              This is equivalent to the -d recurse option.

日本語man信用できない

参考資料

https://stackoverflow.com/questions/21738574/how-do-you-exclude-symlinks-in-a-grep

正規表現あと読みと grep -o の組合せで強い文字列の抜き出しができる

正規表現にはあと読みの条件付きマッチの書式がある。

(?<=pattern)expression
expression(?=pattern)

このあと読みの条件マッチを使うことで、○○のあとの△のような文字をダイレクトに抜き出すことが可能になり、コマンドと組み合わせると非常に強いクカを得ることができる。

正規表現のあと読みをgrep で使うことが出来る。

この名前付きのマッチングをgrep で使うと便利そうなので、調べてみたら 私の使ってるgrep は対応してたので、実例を残すことにした。

grep を使った文字列の抜き出し

grepをつかってマッチした文字列をダイレクトに抜き出すことが出来ます。 その際に、マッチする箇所を限定することが出来て便利です。

grep -Poで抜き出し

たとえば、A のあとに続くIPアドレスが欲しい時

$ dig t.co | \grep -Po "A\s+\d.+$"
A    104.244.42.133
A    104.244.42.5
A    104.244.42.197
A    104.244.42.69

A も含めてIPアドレスが取れてしまう。

これを条件マッチでやると

正規表現を「 lookbehind assertion」(後置参照)に変えることで、きっちりマッチする。

$ dig t.co | \grep -Po "(?<=A\s)\d.+$"
104.244.42.133
104.244.42.5
104.244.42.197
104.244.42.69

lookbehind assertion (?<=XXX)は、正規表現に〇〇に続く△でこの場合は「Aのあとにある数字から始まる文字列」を指定している。

正規表現の条件で絞っている。

そのため名前付きマッチだとか正規表現の後方参照で $0 を取り出す必要もない。

面倒なことが少し減っている。

他の例

dig の結果からIPを抜き出す。

たとえば、dig をした結果から、IPアドレスを抜き出そうとする

$ dig _netblocks3.google.com txt +short | \grep -oP '(?<=ip4:)[0-9\.]+/[0-9]+'

-Po をつけた場合。

この結果は次のようになる。

172.217.0.0/19
172.217.32.0/20
172.217.128.0/19
172.217.160.0/20
172.217.192.0/19
172.253.56.0/21
172.253.112.0/20
108.177.96.0/19
35.191.0.0/16
130.211.0.0/22

単純な正規表現の場合

-Po をせずに、正規表現で抜き出すと、次のようになってしまう。

$ dig _netblocks3.google.com txt +short | \grep -oE '(?ip4:)[0-9\.]+/[0-9]+'
ip4:172.217.0.0/19
ip4:172.217.32.0/20
ip4:172.217.128.0/19
ip4:172.217.160.0/20
ip4:172.217.192.0/19
ip4:172.253.56.0/21
ip4:172.253.112.0/20
ip4:108.177.96.0/19
ip4:35.191.0.0/16
ip4:130.211.0.0/22

この結果を再度awk/sed して置換するのも面倒ですよね?

dig で spfレコードしらべて、TXTレコードからIPアドレス取り出すという作業ですら、grep だけで解決するのである。プログラミングしなくてもいいのは楽である。

他にもこのようなことに使える。

takuya@~$ sudo networksetup  -getairportpower en0
Wi-Fi Power (en0): On

この結果からen0のあとの ONだけを取出したい。

takuya@~$ sudo networksetup  -getairportpower en0  | env grep -Po '(?<=:)\s?\w+$'
 On

Macアドレスをコマンドの結果から取得したり。

takuya@~$ ifconfig en0 | env  grep -Po  '(?<=ether\s).+'
60:03:08:a1:82:0c

IPアドレスをしっかり抜き出したり。

takuya@~$ ifconfig en0 | env  grep -Po  '(?<=inet\s)[0-9\.]+'
172.24.49.119

慣れると便利。

慣れてくると割と便利に使うことが出来る。この文字の「ココだけが」ほしいんだけどなぁっていうときに、文字列が取れすぎるとか、絞り込めないときに知っておくと最後の一歩をすることが出来る。

今回つかった grepGNUのパッケージです。

takuya@work$ /Users/takuya/.bin/grep -V
grep (GNU grep) 3.1
Packaged by Homebrew
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

一般的なLinuxなパッケージにも含まれています。 Linuxディストーションによっては、grep はalias されている場合があります。そのためalias があると上手く動かなったりするので、alias を解除してから試す必要があります。

参考資料

今回はこの書籍から正規表現を学びました。

2021-03-31

dig sfpで、TXTレコードの例を追加

splitで指定した行数でファイルを分割し拡張子も付与するsplitコマンドの基本的な使い方

split コマンド便利ですよね

split コマンドは、ファイルを分割するコマンドです。

一度くらいは見たことが在るんじゃないでしょうか。

split コマンドでファイルを分割する

ファイルを分割してもアルファベットのよく分からないファイル名になるので、よく使う方法をご紹介。

ただ split コマンドを実行すると次のようなファイルになってしまう。

xaa
xab
xac

行で分割する

バイトで分割しても現代ではあまり役に立たないので、 -l をつけて行数で分割する

split -l 100 input.log

行数で分割すると便利ですよね。

-d をつける

split 対象ファイル -d 出力ファイル

こうすると、ファイル名が 0始まりの数字で分割される

split  input.log  -l  -d out-

出てくるファイル

out-0
out-1

拡張子を付ける --additional-suffix=.csv

extensions つまり、拡張子を付けないとあとで識別が不便なので、拡張子もつけておく。

takuya@work$ split -l 400 entries.csv -d  --additional-suffix=.csv  entries-
takuya@work$ ls en*
entries-00.csv  entries-01.csv  entries-02.csv  entries.csv

まとめて関数にしても良いかも

元のファイルと同じ拡張子で、デフォルト100行くらいで分割する自分専用のコマンドを作っておいても良いかもしれない。

bashでちょっとしたコマンド作成の練習には良いかもね。

参考資料

  • man split

なかなか取れないiPhone修理予約を出来る限り当日に確実に取る方法

iPhoneのバッテリー交換の予約が取れなかった

iPhoneが急に電源が切れたり、残量20%でシャットダウン後に再起動で利用してたが、いい加減限界なので、バッテリー交換に行こうとた。

が、予約が取れない。iPhoneの交換の予約をとるのが難しい。

クイックガレージに行って根掘り葉掘り聞いてきました。

先日、Macの修理でクイックガレージに行くことがありました。そのときにMacの状態チェックを待っている間に、窓口の担当者と雑談してきました。

私「めっちゃ、混んでますねーww」
窓「そうですねー、Macは空いてて暇なんですけどねーwww」
私「この人たち、みんなiPhoneなんですか」(店内を見渡しながら
窓「ですねー、Macは1日1件もあるかないかです」
私「iPhoneは予約をとるのが難しいですもんね」
窓「そうでもないですよ、わりと取れてるみたいです」
私「え?そうなんですか?」

実はコツがあった。

アレコレ話しているとわかってきました。

予約はとるのが難しい、なのでなくタイミングの問題だと。

毎日10時台なら当日予約がWEBから取れる

予約には枠があって開放上限があるようです。データベースの更新タイミングがあるみたい。

予約は一週間前まで取れるのですが、当日枠があり、当日の10時か11時くらいに開放される的な話を聞いた。店舗により時間帯に前後が在るらしい。

そこで毎日10時台か11時台だと比較的かんたんに予約ができるとのこと。

試してみた

おお、当日の予約ができる。今日の予約できるぞ。(11時しらべ

f:id:takuya_1st:20180424120513p:plain

よく見たら、前日に1週間先まで埋まっていたクイックガレージ梅田が予約できる。

f:id:takuya_1st:20180424115555p:plain:w200

予約取れないで困る人は

朝10時か11時すぎに試してみましょう。

予約が取れないとおもったら、正午になる前に調べてみてはどうでしょうか。

お昼休み時間帯に予約が一気に消化されしまうのかもしれません。

ダメ元でキャンセル待ちで訪問して待たされるの辛いですよね。

キャンセル待ちで入れても担当者に次からは予約してくださいねと釘を刺されるし、あまりいい気分はしない。

わたしは、この方法で好きな時間に予約が取れて救われました。

blurなどのHTMLEvent イベントをちゃんとおこしてみる

blur イベントが上手く起きない

react などちょっと最近のJSだと Element.blur() で イベントが発火しなかった。

動かない

a=document.querySelector("#zipCode")
a.blur()

blur とかフォーカスのイベントハンドラが上手く起動しない。

動く

ちゃんとEventをdispatch すればうごく

a=document.querySelector("#zipCode")
a.value = '1030001'
var evt = document.createEvent("HTMLEvents");
evt.initEvent("blur", false, true);
e.dispatchEvent(evt);

これは、CustomeEventでも作れて

a=document.querySelector("#zipCode")
a.value = '1030002'
evt = new CustomEvent('blur')
e.dispatchEvent(evt);

または、ちゃんとFoucsEventをnew して

evt = new FocusEvent('blur')
e.dispatchEvent(evt);

こうすれば、イベントがうまくは起動する。HTMLElement.blur() HTMLElement.focus() だとイベントが起きないのかなぁ

昔から疑問だったんだけど、未だによくわからない。

cut コマンドで途中を棄てる(除外)する

cut コマンドで中間を削除したい時

絡む指定の複数の条件を 感まで繋げば、途中のカラムをすてて、歯抜けを作ることが出来る。

cut -f 2-5,7-10

ほかにも、カンマでつなぐのは複数個作れて

cut -f 1,3,5,7

のように数字を書いてもいいし、数字が続く場合は、 4-9のようにハイフンも使える。便利

参考資料

'cut' command - Tutorial : How to 'cut' all fields except the ones specified or invert field selection

コミック発売日をを見てたら、よつばと!見つけて、わりと楽しみな4月

何気なくAmazonの新刊を眺めてたら

よつばと!の14が出るんですね。

よつばと!(14) (電撃コミックス)

よつばと!(14) (電撃コミックス)

そのまま、Amazonの新刊みていたら、4−5月はわりと楽しみな一ヶ月あった。

4月発売予定のロングタイトル。

ながく続いてるタイトルが続々と発売日を迎えるので本当に!?これ全部連休中に読めるか?ってワクワクしてる。

テンション上がってきたので、備忘録代わりに新刊一覧を貼っておきます。

とくに、「デミちゃんは語りたい」「ダンジョン飯」「よつばと!」は楽しみ。隔年発売のタイトルいっぱいじゃないですかぁ

大型連休前後ってコミックスの発売日が重なるんですかね?そういうものなの?

4月5月で楽しみな発売日タイトル。忘れないようにメモ

多いので、逐一メモしないと忘れる。。。ほしいものリストだとソートとか面倒だし。ココに書いておこうかなと

亜人ちゃんは語りたい(6): ヤンマガKCSP

亜人ちゃんは語りたい(6): ヤンマガKCSP

ダンベル何キロ持てる? 4 (裏少年サンデーコミックス)

ダンベル何キロ持てる? 4 (裏少年サンデーコミックス)

ダンジョン飯 6巻 (ハルタコミックス)

ダンジョン飯 6巻 (ハルタコミックス)

あまんちゅ!  12 (BLADECOMICS)

あまんちゅ! 12 (BLADECOMICS)

ドメスティックな彼女(18) (講談社コミックス)

ドメスティックな彼女(18) (講談社コミックス)

王家の紋章(63): プリンセス・コミックス (プリンセスコミックス)

王家の紋章(63): プリンセス・コミックス (プリンセスコミックス)

インフェクション(10) (講談社コミックス)

インフェクション(10) (講談社コミックス)

キミイロ少女 完全版 (百合姫コミックス)

キミイロ少女 完全版 (百合姫コミックス)

ssh 公開鍵の指紋を確認して、gitの公開鍵ログインが通ってるか確認する。

サーバーのSSHのログを見ていると次のようなものがある。

git(gitlab)は 単一ユーザとしてログインして、アプリ内で別ユーザに分割するので、アクセスログを見ていると、どのログがどの公開鍵かぱっとわからない。

Accepted publickey for git from 110.66.166.xxx port ssh2: RSA SHA256:ZBTKfSJOp46Wa
Accepted publickey for git from 122.249.189.xxx port ssh2: RSA SHA256:6hsJqs+UYtaqn
Accepted publickey for git from 153.183.186.xxx port ssh2: RSA SHA256:2UsYMJTNfHog
Accepted publickey for git from 153.183.186.xxx port ssh2: RSA SHA256:6hsJqs+UYtaqn
Accepted publickey for git from 153.183.189.xxx port ssh2: RSA SHA256:NxqmEpe7bbWv
Accepted publickey for git from 183.76.241.xxx port ssh2: RSA SHA256:3R31KV8N0vK6u
Accepted publickey for git from 49.106.193.xxx port ssh2: RSA SHA256:qpG9ikqYC8kkcx

公開鍵のフィンガープリントを取得する。

ssh-keygen -lf path/to/id_rsa.pub

このコマンドを使うと、公開鍵から指紋を 取り出すことが出来る

takuya@sample$ ssh-keygen -lf out.pub
2048 SHA256:NxqmEpe7bbWvK86VQn5Xhxxxxxxxxxxxxxx takuya@test (RSA)

指紋のハッシュをSHA256で取り出すのでサーバーのログと一致して嬉しい。

gitlab などに登録された公開鍵はmd5

管理画面からは指紋がMD5なのでぱっとわからない。

公開鍵のフィンガープリントはMD5でもアプリで表示されることがあるのでその方法でも一致を確認できる

takuya@sample$ ssh-keygen -E md5  -lf  out.pub
2048 MD5:5f:37:90:4b:c3:e1:6a:fe:fd:d2:ea:7a:00:00:00:00 takuya@test (RSA)

指紋のみかたをしっておく

せっかくハッシュを見たら解るのに、意外と使いこなせないので調べた。

参考資料

SSHの鍵の指紋が正しいものかどうかチェックする方法 - くろの雑記帳

中間者攻撃するわ、公衆WiFiを語るのにフィルタリングするわ、これはダメでしょ

とある公衆WiFiにログインしたんですが。

これ、完全に中間者攻撃の状態ですよね。リダイレクトすらしない。WEB技術のマナーも糞もあったもんじゃない。

ログイン画面がこれ

http://t.co のURLに ログイン画面がインジェクション(改竄)されている。

f:id:takuya_1st:20180410011634p:plain

別のログイン画面の結果がこれ。

僕のブログのURLが完全に書き換わっている。

f:id:takuya_1st:20180409202104p:plain

URLそのままでは、通信の改竄に当たる

ドメインそのままで通信内容を書き換えるのは、改竄に値する。通信を提供するサービスとして、あってはならないことだ。

WEBブラウザは、ドメイン単位でセキュリティの権限を管理するSame Origin Policyがあるが、この状態では、同一生成元ポリシーがおかしなことになる。このままでは、パスワードの自動入力が正しく動作しないために、おかしなことになる。

リダイレクトしないから、暗号化通信で中間者攻撃になる。

完全に中間者攻撃としてブラウザに検出されている。

これは、セキュリティ上やっていはいけない感じがある。

f:id:takuya_1st:20180409202209p:plain

なぜだめか?

ドメインの詐称で中間者攻撃を「ただしい」とする仕様はユーザーに間違った知識を植え付ける可能性がある。

とくに、改竄される状態が「正しい」と公式宣言する現状は危うい。

しかも文字コードISO-2022-JP って

いつの時代ですかこれ。。。いまどきUTF-8使わないサイトとか久しぶりに見た。 仮にiOSだとこれどうなるんだろうか。

f:id:takuya_1st:20180409203005p:plain

はてブが止まる。

ニュースの閲覧もダメなんですか。。。

f:id:takuya_1st:20180410004506p:plain

SNSはフィルタリング対象ですか?

f:id:takuya_1st:20180409205050p:plain

HTTPSもIPベースで止めてるんですね。通信エラーにしかみえないのは、問題が多いですよね。フィルタリングしてると明示しないと

f:id:takuya_1st:20180409205200p:plain

f:id:takuya_1st:20180409205515p:plain Google Chromeが通信エラーとして処理するから、画面のキャプチャの状態になりChromeに救われている。

通信エラーによりストップ理由も明示されない。

通信エラーになりストップ理由が閲覧不可能になっている。

ストップされる理由が表示されないはまるで駄目ではないですか?

せめて、ストップされる理由がHTTPSで表示されるようにしてほしいです。

どの通信がストップ対象になるのか明示されないでフィルタリングはありえないと思いませんか。

何処が納入したんですかコレ

どこだよ、この事業者は、と思った。どこの機器ですかね?この辺の業者ですか?フルノ?

この入札要件書いた明石市Wifiをやる市役所職員はなんなのですか?調達要件を書く前に、すこしくらいは他の市町村や公衆無線LANを調べたんですか?

社内(庁内)の無線LANと、公衆WiFiの区別がついてないですよね。

公務員試験の合格者なら

憲法くらいは、ちゃんと勉強してるよね?憲法21条第2項を読み直してください。条文を思い出してほしいです。

利用規約にアレコレ書いたとしてやって良いことと悪いことが在る。とくに一般向けに解放してる公衆WiFiであればなおさらですよ。

盗聴しておいて、「セキュリティは万全です」はちょっと自己矛盾ではないですかね。

関連資料

明石市の職員さんには、以下の資料を読んでいただきたく思います。

日本国憲法第21条 - Wikipedia

Wi-Fi提供者向け手引きの「通信の秘密保護」と「届出義務」について

http://www.soumu.go.jp/main_sosiki/joho_tsusin/security/cmn/wi-fi/Wi-Fi_manual_for_AP.pdf

青少年ではないですから、フィルタリングには同意できないし、同意項目もないですよね。

サービスの提供者と利用条件は市役所や図書館のHPで閲覧できないけどありなの?

そういえば、地方公共団体には届出義務があったはずだけど、165条の通信事業者がフィルタリングや改竄するってありなの?(今度調べる

特定のサイトを閲覧できないようにしていた公衆無線 LAN に行政指導

Wisprについて

調達要件にwisprの文言を入れときゃよかったのに・・・

WISPr について - eggshell blue

ChromeのデフォルトがHTTPSになったので再調査

ChromeがHTTPを「保護されてない通信」としてマーキングするようになったので、再調査。

f:id:takuya_1st:20180727165459p:plain

全然更新されないの。完全に中間者攻撃状態。

図書館の運営をしてるのはドコなんですかね。 そろそろガチでバトったほうがいいか

図書館の自由に関する宣言について

なぜ、わざわざ晒し者にしてるのか、

理由はというと「図書館の自由に関する宣言」にある。 「知る権利」を提供する図書館で、こんないい加減なフィルタリングが行われているから、ムカついたので記述することにした。

図書館の自由に関する宣言

  • 第3 図書館は利用者の秘密を守る
  • 第4 図書館はすべての検閲に反対する

一般向けの公衆無線LANは職員向けの庁内LANと似てるけど同じではないでしょ。

2018-07-27 追記

ぜんぜん更新されないので追記

nginxのサイト毎の設定が面倒なのでワイルドカードでディレクトリの有無で設定する

nginx のサイト毎の設定が面倒くさい。

サイトが追加されるたびに、ドメインとファイルを追加するのは面倒なので、ワイルドカードで設定したい。

Apacheだとワイルドカード的なことを割と面倒くさい感じで rewrite 組合せたり、virtualhost 設定をしたりだったけど、

nginx だと 正規表現と名前付き後方参照パターンマッチングで済む。

設定例

upstream php-fpm {
  server unix:/var/run/php/php-fpm.sock;
}


server {
        listen 81 ;

  server_name "~^(?<domain>.+)$";

        root /var/www/virtualhosts/$domain/www-data;

        # Add index.php to the list if you are using PHP
        index /_h5ai/public/index.php ;

        server_name $domain;

        location / {
    autoindex on;
                try_files $uri $uri/ =404;
        }

  location ~ \.(php)$ {
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
    fastcgi_pass php-fpm;
  }
}

設定のポイント

これで、正規表現のパターンマッチングをして、 domain という名前で後方参照出来るようにする。

  server_name "~^(?<domain>.+)$";

これで、domain にマッチさせる。

        root /var/www/virtualhosts/$domain/www-data;

応用編

サイトのサブドメイン毎に設定したいときも同じ

  server_name "~^(?<subdomain>.+).example.com$";

こうすれば、サブドメインごとのマッチングも簡単に。

   root /var/www/example.com/$subdomain/www-data;

設定するメリット

ドメインディレクトリを作ればサブドメインドメイン毎のサイト公開ができるようになる。

この手順だと誰でも設定できるようになるので、あとはwordpressの中身をコピペすれば動くようになる。

docker で wordpressを作らなくても良くなるのは便利だよ。

参考資料

http://nginx.org/en/docs/http/server_names.html

関連資料

ワイルドカードでApacheのVirtualHost-はてなブログでやってるあれ - それマグで!

WEBサーバー(nginx/apache)で、ディレクトリをオシャレに共有する

ディレクトリのインデックス機能をオシャレにする。

ファイルをネットワーク共有する一番手っ取り早い方法は、HTTPサーバーで共有することだと思いません?

認証を入れればアクセスログが残るし、どのファイルが何処にあるか解るし、Slackに貼って渡すのも便利だし。

h5ai でオシャレする。

h5ai をつかうと、わりとエクスプローラーっぽくなって、html5 auto index の略かな?

インストールした結果は

ためしに、うちのサーバーに入れてみた結果がこれ

f:id:takuya_1st:20180408013031p:plain

インストールと設定

公式のリリース zip を取ってくる

zip を取ってくる。

 curl -LJO https://release.larsjung.de/h5ai/h5ai-0.29.0.zip

公開ディレクトリにインストールする。

cd /var/www/example.com/html

ここで展開する。

 unar h5ai-0.29.0.zip

php の設定をするんだけど、一番手っ取り早い手段があって。それは、Directory Index に設定するだけ

upstream php-fpm {
  server unix:/var/run/php/php-fpm.sock;
}

server{
   ## 略

   index  /_h5ai/public/index.php ;

  location ~ \.(php)$ {
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
    fastcgi_pass php-fpm;
  }

apacheのとき

DrectoryIndex  /_h5ai/public/index.php ;

apache の場合のphp設定は、は mod_phpphp-fpm で設定が大きく異なるので割愛。

あとは、サーバーをリロード(再起動)すれば、ディレクトリ表示が盛れる!

認証に関してはいろいろ手法が在るのでコレは別のエントリに記述する。

参考資料

h5ai · modern HTTP web server index for Apache httpd, lighttpd, nginx and Cherokee · larsjung.de

Indexページは盛れる! | 技術情報ブログ | マネージドホスティングのディーネット