それマグで!

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

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

デスクトップの切替コマンドにbash completion を作った

以前、デスクトップの切替コマンドを作った

git stash 的に、デスクトップをスパッと片付けて、次の仕事に移りたいなって。

ユーザー切替でもいいのだけれど、デスクトップを切り替えておけば作業中ファイルをすべてデスクトップに散らかしてしまえば管理が楽だしね。

ただ、デスクトップの切替が不便だったので completion かいておいた

以前作ったコマンドについて

takuya-1st.hatenablog.jp

上記のコマンドのcompeltion がこれ

completion だけど、結構汎用的に書いておいたので何にでも使えると思う。

gist.github.com

切替コマンドで頭を切り替える。

デスクトップを切り替えると頭が切り替わる。

色々を切り替えると頭がスッキリするよね。

ブラウザにもこういう機能欲しいなぁ。

ブラウザをプライベートタブで開くように、ブラウザも作業毎にワークスペースほしいよね。

むかしはOperaにあったんだけどなぁ。Vivalidiにもあるといいな。

参考資料

http://takuya-1st.hatenablog.jp/entry/2016/02/10/175604

http://d.hatena.ne.jp/snaka72/20090930/1254316751

completion で決定後にスペースをいれる方法

https://stackoverflow.com/questions/2339246/add-spaces-to-the-end-of-some-bash-autocomplete-options-but-not-to-others

ssh をiptablesで国内限定にする(日本国外のIPから規制する)

グローバルIPssh を有効にしたらスキャンがいっぱい来る

別に、実害は無いんだけど、ちょっと気持ち悪いよね。 1時間で1000近いログが溜まるんですね。

ポート22のsshはすげぇアクセス来るんだよね。

ISP側である程度のフィルタをされているはずなんだけど。それでもコレくらい来る。

Dec 21 15:02:13 raspi3 sshd[3524]: Received disconnect from 115.238.245.2 port 33445:11:  [preauth]
Dec 21 15:02:13 raspi3 sshd[3524]: Disconnected from 115.238.245.2 port 33445 [preauth]
Dec 21 15:03:49 raspi3 sshd[3532]: Received disconnect from 115.238.245.6 port 34296:11:  [preauth]
Dec 21 15:03:49 raspi3 sshd[3532]: Disconnected from 115.238.245.6 port 34296 [preauth]
Dec 21 15:04:34 raspi3 sshd[3537]: Received disconnect from 221.194.47.245 port 57877:11:  [preauth]
Dec 21 15:04:34 raspi3 sshd[3537]: Disconnected from 221.194.47.245 port 57877 [preauth]
Dec 21 15:05:40 raspi3 sshd[3542]: Received disconnect from 221.194.47.243 port 52506:11:  [preauth]
Dec 21 15:05:40 raspi3 sshd[3542]: Disconnected from 221.194.47.243 port 52506 [preauth]

大学の研究用のガチのグローバルIPだと秒間で10とか来てたから、ソレを考えたら少ない方だわ

公開鍵認証のみなので実害はない。

preauth で止まってるし、password をブルートフォース攻撃されるわけでもないので、別にいいんですが、ログをみてるときにちょっと気持ち悪いよね。 家のドアチャイムを定期的にピンポンダッシュされて空き家か調べられるのはっちょっとだけ良い気がしない。

日本国内のIPアドレスに限定してみよう。

ssh のポートについては日本国内のIPアドレスに限定してみようと思い立った。

日本国内のIPアドレスは何処で取れるのか?

ぐぐったらいくつか在るんだけど、今回は、 https://ipv4.fetus.jp/ を使うことにした。

日本国内のIPアドレスは→ https://ipv4.fetus.jp/jp.txt

iptableにコレ全部登録するの?

流石に約3000件を登録するのはちょっと現実的じゃないよね。

iptables で第三国のIPアドレスを制限して、日本国内に限定したいとか思ったんですが。IPアドレスの範囲を指定するのって思った以上に不便。

iptablesの件数がどこまでも伸びていってしまうよね。

ipsetを使います。

ipsetを使えばかんたんに設定できるようです。

調べてみたら カーネルにnetfilter に ipset という、IPアドレスをグルーピングしてフィルタを記述できるセットが用意されていた。

ipset のインストール

sudo apt search ipset 
ipset/stable 6.30-2 armhf
  administration tool for kernel IP sets
sudo apt install ipset

ipset の使い方

ipset は、名前を付けてリスト(フォルダ的なもの)にIPアドレスか、ネットワーク・アドレスをガンガン放り込んでグルーピングしていくもの

ipset でリストを作る・潰す

リストの作り方と削除

sudo ipset create my_list hash:ip
sudo ipset destory my_list

hash:ip は ip アドレスで、hash:net はネットワークで、それぞれ指定する。件数が多いものはまよわず net を使う。

sudo ipset create my_list hash:net
sudo ipset destory my_list

ipset のリストにIPを登録する・確認する・削除する

ip set のリストにIP・ネットワークを登録し確認し、削除する。

sudo ipset add my_list 1.0.16.0/20
sudo ipset list my_list
sudo ipset del my_list 1.0.23.58

ただし、hash:ip で定義したリストに、サブネット切ったネットワークで、ガッツリIPを放り込むと大量にエントリが発生するので注意が必要

hash:net の方がいいと思う。

実際に入れてみた例

$ sudo ipset create my_list hash:net
$ sudo ipset add my_list 1.0.16.0/20
$ sudo ipset list  my_list
Name: my_list
Type: hash:net
Revision: 6
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 396
References: 0
Members:
1.0.16.0/20

国内限定にするフィルタを作る

ipset の使い方がわかったところで、iptables と連携するための ipset を作ります。

日本国内のIPをざっくり取得する

日本に割当てられたIPv4アドレスを取得する

curl https://ipv4.fetus.jp/jp.txt | \grep -v  '^#'

何度も取得に行くと負荷かけちゃうので、適当にキャッシュした方がいいです。

日本国内IPをざっくり登録する

取得した結果のすべてを ipset で自分の許可リストに放り込んで行きます。

$ curl https://ipv4.fetus.jp/jp.txt | \grep -v  '^#'  |xargs -I@ -P 0  sudo ipset add my_list @

登録したら、確認する

登録ができたら確認してみます。

$ sudo ipset list my_list

登録結果を保存する

登録した結果を保存して

 sudo ipset save my_list > my_list.txt

iptablesでフィルタを作る準備をします。

万が一失敗しても死なないように、別ポートでもsshd を起動しておきます。

/etc/ssh/sshd_config

Port 22
Port 2222

port 2222 でもssh を起動しておきます。

ssh -p 2222 で接続ができることを確認

失敗した時でも安心できるように別ポートが使えることを確認

ssh localhost -p 2222

ローカルIPの追加。

今回は、国内限定にする=ホワイトリスト方式。なので、許可リストにローカルIPを入れておきます。

sudo ipset add my_list 192.168.0.0/16
sudo ipset add my_list 10.0.0.0/8
sudo ipset add my_list 172.16.0.0/12

最後に、ipset の登録値を使ってiptablesを構成する

sudo iptables -I INPUT -m state --state NEW -p tcp --dport 22 -m set --match-set my_list src -j ACCEPT

iptables の設定が出来たことを確認

takuya@raspi3:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh match-set my_list src

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

設定を保存( permanently/persist)して再起動後も有効な設定 にする

systemd をつかって ipset の取得を定期実行にしたりしておく。

起動時にipset を再度有効にするようにしておく

sudo sh -c 'ipset save > /etc/ipset.conf'

iptablesの設定の保存。これは定番 iptables が再起動後に ipset のリストを使うようにしておく

sudo sh -c 'iptables-save > /etc/iptables.up.rules'

再起動後に実行されるようにする。

再起動に有効にする。

sudo vim /etc/network/if-pre-up.d/iptables-with-ipset
sudo chmod ug+x /etc/network/if-pre-up.d/iptables-with-ipset

/etc/network/if-pre-up.d/iptables

#!/bin/sh
##
## 2017/12/23 記述 
## /etc/network/if-pre-up.d/iptables-with-ipset
## 

# ipset からリストを読み込む
ipset restore < /etc/ipset.conf
# ipset を使ってiptablesを構成する
iptables-restore  < /etc/iptables.up.rules

これで、再起動に有効になる。

メモなど

本当は iptables じゃなくて、openssh側の設定でやりたいんだけどなぁ。

openssh-server の拒否リスト(もしくは MatchAddress )的なところで、ホワイトリストを使えれば良いんだけどなぁ。

iptablesはいろいろな設定をドンドン書いていくので、ゴチャゴチャしすぎて整理できないから辛い。

もしかしてv4の方が使いやすい??

v4 の在庫は枯渇してて、どの国にドレだけ割当てられてるかすでに決まっていて今後大幅に増減はないと考えるなら、v4のフィルタって更新やメンテをあまりしなくても動くんじゃないですかね。

参考資料

https://inaba-serverdesign.jp/blog/20150209/ipset_iptables_country_centos6.html

学習しないフォームを強引に学習させる

パスワード保存は素晴らしい

パスワードのブラウザ保存は素晴らしい。パスワードを「頭に記憶」するなど時代遅れの産物だ。

パスワードはブラウザに保存し、ブラウザやPCにマスターパスワード(もしくは指紋認証)を付けるのがいまどきだとおもう。いまどきキーチェーン機能がないOSなんてあるんですかね。

パスワードを学習させてくれないフォームを学習する

form を横取りしたり、Actionしないフォームを作られると面倒なので学習させる

var p = document.querySelector('input[type=password]')
var f = p.form
f2 = f.cloneNode(true)
f.parentElement.replaceChild(f2, f )
f2.action= location.origin
f2.onsubmit = function(e){ e.preventDefault();e.stopPropagation(); }
f2.submit()

方針としては、とりあえずEventHandlerを全消しして、Actionをフォームと違うURLに送る。そこへSubmit()する。

これで、フォームの入力を学習することが出来る。

もし、form 要素がないときは insert してform 要素を強引に作成すればいい。(icloudなど)

りそな銀行マジ困る。

今回はりそな銀行だった。

ログインの学習くらい平気

ログインした後に、資金移動で第二パスワードを求められるので、そっちを守れば良いわけでログインパスワードを死守しようとする姿勢がまるで理解できなかった。

愚痴など

パスワードは完全な乱数にして、20文字くらい使っていて、なおかつログインIDを「非公開」で憶測不可能なものにするべきだよね。それくらいをやってからセキュリティチェックだの、不審なメールに注意しろとか。そういう出来る限りの対策を行った上で、注意喚起を行ってほしいなどと思う。

ウイルスに注意しろとかいうくせに、DOMDocumentのイベントを横取りしてコピペできなくなってたり右クリックを妨害したり、ミレニアム世代のインターネットのブラクラまがいのウイルス的な行為をやってなぜセキュリティといえるのだろうか。

究極的には、Slackのようにメールクリックしたらログインできるくらいでいい。

イ◯ン銀行とか三菱京U◯J銀行とかCloudFlareとか、ログインした後にメールの番号を要求するからな。。。面倒だしとっととバイバイしたわ。

トークンつかっても防ぎようがないものは防ぎようがない。警察庁金融庁あたりがトークンを義務化するようにガイドラインをだしてるけど、問題はそこじゃないだろって感じはある。

cssの important は上書き出来るんじゃん

CSSセレクタ順位を使えば上書きできる

/*くっそやりやがった・・・*/
#header_navi{
     positon: fixed !important;
}

でも大丈夫かんたんに上書きできる

body div#wrapper div#header_navi{
     positon: inherit !important;
}

とかやれば、単純に上書きできる。

CSSのカスケード順位の方が優先なのでした。

CSSのカスケード順位が同じときに !important で上書き拒否できるんですね。

つまり、

#header_navi{
     positon: fixed !important;
}
div#header_navi{
     positon: inherit !important;
}

これだと div を付けてる分だけ、CSSの順位で、後から提示なのでちゃんと上書きできるんですね。

これで、アドブロックの自作拡張が捗る

参考資料

http://beniyama.hatenablog.jp/entry/2014/08/21/005522

printf のフォーマットを使って覚える。

printf のフォーマットの例

printf で文字の整列などをすれば楽ちんだろうとは思うんだけど、なかなか覚えきれないので、いくつか例を以て覚えておきたい。

takuya@Desktop$ ruby /Users/takuya/printf_examples.sh
prinft %d      32 => '32   '  # 数字
prinft %5d     32 => '   32'  # 右寄せ
prinft %-5d    32 => '32   '  # 左寄せ
prinft %04d    32 => '0032 '  # 0埋め
prinft %-05d   32 => '32   '  # 0埋め+左寄せ
prinft %+d     32 => '+32  '  # 符号(+)
prinft %+d    -32 => '-32  '  # 符号(-)
prinft %.1f   -32 => '-32.0'  # 小数桁1
prinft %.2f    32 => '32.00'  # 小数桁2
prinft %#x     32 => '0x20 '  # 16進数
prinft %#o     32 => '040  '  #  8進数
prinft %#b     32 => '0b100000'  #  2進数
prinft %#08b    7 => '0b000111'  #  2進数0埋め

使ったソースコード

#!/usr/bin/env ruby

formats = {
  '数字'    => [ "%d", 32 ],
  '右寄せ'  => [ "%5d", 32 ],
  '左寄せ'  => [ "%-5d", 32 ],
  '0埋め'   => [ "%04d", 32 ],
  '0埋め+左寄せ'   => [ "%-05d", 32 ],
  '符号(+)' => [ "%+d", 32 ],
  '符号(-)' => [ "%+d", -32 ],
  '小数桁1'  => [ "%.1f", -32 ],
  '小数桁2'  => [ "%.2f",  32 ],
  '16進数'  => [ "%#x",  32 ],
  ' 8進数'  => [ "%#o",  32 ],
  ' 2進数'  => [ "%#b",  32 ],
  ' 2進数0埋め'  => [ "%#08b",  7 ],
  # '金額'  => [ "%'d",  32 ], not supported

}


for k, e in formats do 

  f = e[0]
  v = e[1]

  printf( "prinft %-5s %4s => '%-5s'  # %-5s \n" , f, v , f%v, k   )

end

関連資料

prinft %s は文字列の長さが指定できる! - それマグで!

ubuntu がネットワーク待ち(systemd-networkd.wait)で起動が遅い・・・

ネットワーク周りをいじると再起動が遅いですね。

起動時にネットワーク待ちになる。DHCP待ちになる??

A start job is running for wait for network to be configured.

これで、しばらく時間がかかるので、Virtualboxなどから使ってると大変。

LANケーブル未接続の状態で、起動したときに、起動が遅くて遅くて起動に時間がかかるので、高速化したい。

対策

ネットワークを待たない。

systemctl disable systemd-networkd-wait-online.service
systemctl mask systemd-networkd-wait-online.service

systemd-networkd は、systemd でネットワーク周りの設定を司るやつ。

systemd-networkd-wait-online はsystemd-networkdを待つためのジョブ。個人的には、正直無くていい。

UbuntuのネットワークまわりはSystemdになってからむしろ起動が遅くなって、Systemdで起動速くなる的なのなんだよってなる。

関連資料

ubuntu のネットワーク設定が変わってる /etc/network/interfaces no longer used - それマグで!

参考資料

https://askubuntu.com/questions/972215/a-start-job-is-running-for-wait-for-network-to-be-configured-ubuntu-server-17-1

りそな銀行のパスワードが12文字以下で、こいつらハッシュ化しないんじゃね?と疑問に思う

りそな銀行に口座を作った

近所のファミリーマートが潰れた。サンクスがファミマ転換で近所にファミマが4軒になり、旧サンクスが生き残り、ファミマが閉店した。ファミマのe-net が使えなくなった。半径2Kmが旧サンクスだけになった。ATM難民になった。

近所のサンクスにはBankTimeである。BankTimeはファミマ転換でe-Netになるとかとおもったら、BankTimeのATMのまま継続された。手数料無料での現金の確保が難しくなった。

仕方なくBankTimeを使うためにりそな銀行の口座を作った

BANKTIMEはダメだった。

りそな銀行の口座でも、BANKTIMEで18時以降、時間外手数料を取られる。悔しい。

これじゃ口座を開設した意味ないじゃん。平日の昼間に駅前のりそな銀行に行って、「当支店では口座を開設は住所か勤務地の付近以外の方はお断りしてます」とかいう謎の拒否にも負けず、アレコレ理屈並べて開設したのに。

りそな銀行株主優待で時間外手数料を無料にしてからが本番かな。まぁこれなら新生銀行でいいかと思ったり。

旧サンクスのファミマは当分のあいだBANKTIMEをそのまま運用するらしい(あと数年はこのまま)

りそな銀行のログインパスワードは6−12文字

りそな銀行のログインパスワードは6−12文字。最大文字数が極端に少ないので、このログインパスワードは暗号文にして保存されてシステム管理者が読める状態にあると憶測される。通常であればハッシュ化されるため最大文字数にあまりうるさくないはずだし20文字以上でも問題ないはずだ。

f:id:takuya_1st:20171224031652j:plain

しかも記号が使えない。大文字小文字数字(26+26+10=62種)である。文字数が少ないのであれば、記号は必要だろって感じある。

フリーメールアドレスはお控えください。

理解できなかった。銀行のエンジニアは20世紀で時間が止まってるのか?

スマートフォンのアドレスは「フリーなiCloudGmail」というフリーメールなのではないのか。。。むしろ今時ISPのメアドを使ってて、フリーメールという用語を理解する人がドレだけ居ると思うんだろうか。

f:id:takuya_1st:20171224032140j:plain

秘密の質問とかいう謎セキュリティ

秘密の質問とかいう謎セキュリティがあった。まぁ理解は出来るが、正答登録に憶測されにくいものと指定する割に、サンプルで書いてる質問が出身小学校は?という憶測されるものであり、ツッコミどころが満載だった。

f:id:takuya_1st:20171224032353j:plain

小学校名など、たかだか20未満の候補に限られてしまうので、パスワードに利用してはダメな典型じゃないのか?

ログインシールとかいう謎セキュリティ

これ、何の意味があるんですかね。。MITMされると意味がないし、画像のURLがどの画像を使っても同じだったらセッションハイジャックでも意味が無いと思うんですけど。画像のURLがどの画像を選んでも同じじゃ意味ないじゃん?ゆうちょ銀行の昔のWEBがこんな感じだったな。

URL同じだと無意味だよね・・・

<img id="ctl00_cphBizConf_imgFavImg" 
src="../4001/CreatImagePage.aspx?id=0"
 alt="お気に入り画像" style="border-width:0px;">

f:id:takuya_1st:20171224032540j:plain

てか、こんな無駄な努力するなら、インターネット利用の条件にSSLやEV-SSLの確認方法を紹介して理解しない限り先に進めない仕様にすれば良いんじゃないかな。

そもそも、このログインシールをいつどこでどうやって確認したら安全なのか、ユーザーに説明しないでセキュリティになるんだろうか。と疑念を感じたりした。

何考えたらこういうセキュリティになるんだろうか

メールアドレスの変更に確認メールを送信しない仕様ってのが一番理解できなかったな!

セキュリティとはソフトウェアだけで確保するものじゃない。

ユーザーへの教育や啓発が同時に必要ですよね。ソフトウェア云々じゃないよね。SSLついて教えたほうが速いよね。

そのたUIなどの雑感

画面はシンプルで分かりやすかったから良い。

Chrome のコンソロールの結果をファイルに保存する

console.log の結果を取り出したい。

Chromeデベロッパーツールのコンソールのログに書き出した結果を別の場所で使いたいなと。 いちいち、選択肢してコピーするのも面倒だし、件数が増えてくるとかなり面倒。

また、実行結果をテストケースの結果としてほしいなと思ったりする。

console.log の結果をファイルに取り出して再利用したいなと思った

ブラウザのDOMないに書き出しても良いんだけどソレも面倒だし。もっと手軽にファイルに書き出せないかと。

chromeのコンソールが直接ファイルとつながってくれたら良いんだけど、それも難しそう。

セキュリティ上の懸念もあるし、ブラウザのドキュメントのコンテクスト内で動作しているJSがローカルファイルに直接書き込むことは無理だろうから

どうしようかなと考えてたけど、セカンドベストな方法で妥協することにした。

Save As を使う。

f:id:takuya_1st:20171221190442p:plain

Save As の保存ダイアログ

保存ダイアログを使えば保存は簡単にできる。これがセカンドベストかも知れない。

jot コマンドが便利。乱数・連番生成で、ループ処理や文字列生成にとてもいい。

jot コマンドを知りました。

jot コマンドは、連番の数字やアルファベットを生成したり、ランダムな数字を生成したりに使えます。

連番ファイル名などを作るのに大活躍です。

上手に使えば、Bashスクリプトseq$RAMDOM よりも便利かもしれないっす。

連番を作る

takuya@~$ jot  10 
1
2
3
4
5
6
7
8
9
10

連番をカウントダウン(逆順・降順)

文字列+連番名を作る例

takuya@~$ jot -w  abc 10
abc1
abc2
abc3
abc4
abc5
abc6
abc7
abc8
abc9
abc10

printf のフォーマットで文字列を揃える

takuya@~$ jot   -w 'name%03d'  3 8
name008
name009
name010

アルファベットを連続して生成する

takuya@~$ jot  -w %c 5 a
a
b
c
d
e

アルファベットを連続して生成して、区切り文字で連結する

takuya@~$ jot -w %c -s '_'  5 a
a_b_c_d_e

乱数を作る

takuya@~$ jot -r 3
40
73
84

指定範囲の乱数を作る

takuya@~$ jot -r 1  1 10
7

指定範囲の乱数を指定回数生成する

1から10までの乱数を3つ生成する

takuya@~$ jot  -r 3  1 10
8
10
5

乱数+文字列を作る

takuya@~$ jot -w abc -r 3  1 10
abc1
abc10
abc9

結果を文字列として結合する

乱数+文字列を連続してプリントする。

takuya@~$ jot -s aa  -r 3 10 100
25aa78aa70

応用して、ランダムなビット列っぽいものを作る

takuya@~$ jot -s ''  -r 10 0 1
0110110100

ランダム文字列を作る

ランダムな文字を生成して、結合してしまえばランダムな文字列が得られる

takuya@~$ jot -r -s '' -c  10   a z
oiaisaqaft

参考資料

シェルスクリプトで乱数を扱う - hyconの日記

nextcloud 認証のダイアログが何度も表示される問題

認証のPrivilegeを求めるダイアログが何度も表示される問題に直面した。

Authentication required が連発して先に進めない。

f:id:takuya_1st:20171221183224p:plain

散々探し回ったら、時刻だった。

サーバーの時刻とクライアントの時刻にずれが大きかったことによるものだった、

ntpdate で修正して、 ntp.conf を見直して

時刻修正してrestart して、事なきを得た。

どんだけ誤差があるんだよ。。。さくらVPSUbuntuイメージってNTPd 入ってなかったのかな。

takuya@sakura:/etc/php/7.0/fpm$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp-b3.nict.go. .NICT.           1 u    2   64    1   20.637    0.049   0.000
 ntp-b2.nict.go. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 ntp-a3.nict.go. .INIT.          16 u    -   64    0    0.000    0.000   0.000

nextcloud / owncloud は認証APIが時刻

APIにログイン状態の問い合わせのレスポンスが時刻だった。時刻なのでサーバー時刻がずれてると認証がずれる。そりゃそうか。

apt list --upgradable  のパッケージを指定して個別アップグレード

指定したパッケージをアップグレードする。

アップグレード可能なパッケージは次のコマンドで解るのですが。アップグレード可能なパッケージをどうやって個別アップグレードするんだろうってずっと疑問だった。

apt list --upgradable

個別にアップグレードする方法

たとえば、openssh-serverを個別に指定してアップグレードする場合は次のようにする。

sudo apt install openssh-server --only-upgrade

--only-upgrade はなくてもいい場合が多かった。 ただinstall 指定したら、個別インストールしたフラグが立つ可能性もあるし、あんまりするべきではないかもしれない。

実際にやってみた例:

$ sudo apt list --upgradable
(略
openssh-client/stable 1:7.4p1-10+deb9u2 amd64 [1:7.4p1-10+deb9u1 からアップグレード可]
openssh-server/stable 1:7.4p1-10+deb9u2 amd64 [1:7.4p1-10+deb9u1 からアップグレード可]
openssh-sftp-server/stable 1:7.4p1-10+deb9u2 amd64 [1:7.4p1-10+deb9u1 からアップグレード可]
sqlite3/stable 3.16.2-5+deb9u1 amd64 [3.16.2-5 からアップグレード可]
(略

ここから選んだ一つだけ更新する。

takuya@:-winxp$ sudo apt install openssh-server
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  openssh-client openssh-sftp-server
提案パッケージ:
  keychain libpam-ssh monkeysphere ssh-askpass molly-guard rssh ufw
以下のパッケージはアップグレードされます:
  openssh-client openssh-server openssh-sftp-server
アップグレード: 3 個、新規インストール: 0 個、削除: 0 個、保留: 177 個。
1,150 kB のアーカイブを取得する必要があります。
この操作後に追加で 0 B のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://debian-mirror.sakura.ne.jp//debian stretch/main amd64 openssh-sftp-server amd64 1:7.4p1-10+deb9u2 [39.5 kB]
取得:2 http://debian-mirror.sakura.ne.jp//debian stretch/main amd64 openssh-server amd64 1:7.4p1-10+deb9u2 [333 kB]
取得:3 http://debian-mirror.sakura.ne.jp//debian stretch/main amd64 openssh-client amd64 1:7.4p1-10+deb9u2 [778 kB]
1,150 kB を 0秒 で取得しました (1,158 kB/s)
changelog を読んでいます... 完了
パッケージを事前設定しています ...
(データベースを読み込んでいます ... 現在 306551 個のファイルとディレクトリがインストールされています。)
.../openssh-sftp-server_1%3a7.4p1-10+deb9u2_amd64.deb を展開する準備をしています ...
openssh-sftp-server (1:7.4p1-10+deb9u2) で (1:7.4p1-10+deb9u1 に) 上書き展開しています ...
.../openssh-server_1%3a7.4p1-10+deb9u2_amd64.deb を展開する準備をしています ...
openssh-server (1:7.4p1-10+deb9u2) で (1:7.4p1-10+deb9u1 に) 上書き展開しています ...
.../openssh-client_1%3a7.4p1-10+deb9u2_amd64.deb を展開する準備をしています ...
openssh-client (1:7.4p1-10+deb9u2) で (1:7.4p1-10+deb9u1 に) 上書き展開しています ...
systemd (232-25+deb9u1) のトリガを処理しています ...
man-db (2.7.6.1-2) のトリガを処理しています ...
openssh-client (1:7.4p1-10+deb9u2) を設定しています ...
openssh-sftp-server (1:7.4p1-10+deb9u2) を設定しています ...
openssh-server (1:7.4p1-10+deb9u2) を設定しています ...

参考資料

https://askubuntu.com/questions/44122/how-to-upgrade-a-single-package-using-apt-get

SpotLight検索からコマンドを実行する。(2018/08/17改編)

Alfred みたいにコマンドを実行できたら良いなと思ってた

多機能過ぎるものはあまり好きじゃないし、ぱっと作ってぱっと使えるものでいいかなと思っています

SpotLight の検索対象フォルダに入れるだけ

つまり、 SpotLight が検索しインデックス化出来るところに、コマンドを置いておけばいい。

たとえば、次のような場所

~/Document/bin/

ここはSpotlightが検索してくれないので実行できない。

/usr/local/bin

実行権限をつける

chmod a+x MyTesting

+x して実行権限をつければ準備完了。

あとは選べば実行される。

f:id:takuya_1st:20171209212147p:plain

ほんとコレだけ。

コレだけだけど、Document以下に置くという発送がなくて盲点だった。

Alfredを自慢されたけど

ぜんぜん羨ましくないんだからね。

Spotlightで出来ること

Appleさんは、アプリの機能をパクるので有名だからな。Alfred 出来たような、計算や辞書サーチは簡単にできる

WorkFlowを作るにはAutomator

Automator でワークフローを作っておけば、Spotlightからぱぱっと実行できて便利ですよね。

対象フォルダを入れるだと不十分だった

2018-08-17 HighSierraに新規インストールして気づいた。

Spotlight検索の対象にデベロッパのチェックがあって、これがデフォルトはオンです。

このデフォルトオンがないと検索されません。うっかりオフになっていると検索されないので注意が必要っぽい

f:id:takuya_1st:20180817033200p:plain

SSHをSFTPに制限して、ディレクトリを制限(chroot)した専用アカウントを作る

なぜSFTP専用アカウントなのか

SSHを解放するのはちょっと・・・ね

ssh でなんでも出来てしまうし、なんでも見れてしまうんで。指定したフォルダ以外にはアクセス出来ないようにしたい。

つまり、指定したディストリ=chroot したSFTP専用のアカウントを作ってみようと思った。

chroot 脱出は、、、まぁ出来るんだろうけど、不用意にファイルを見せない的な意味でSFTPに限定したアカウントがあれば便利だねって。

前提条件

SFTPのアカウントをChrootさせるには、いくつか前提条件があって。

  • ssh が起動している
  • アカウントがある。
  • sftp がサブシステムで有効になってる
  • chroot ディレクトリが root:root 755 になってる

SSHを起動してログインできるようにする

これは最初から付属して有効になってるだろうから割愛。

ufw などファイアウォールがあれば、それを使ってログインできるようにしておく

ユーザーの作成

SSHができるユーザーを作成しておく、これも adduser コマンドでなどで十分

複数ユーザーを作るときは、ファイルが共有できるように umask 0002 にして useradd -aG groupname でグループを整えておく

ユーザー名の保護

もし、ユーザー名をよくあるものにして、パスワードログインを許可するのであれば、ユーザー名に難解な文字列を付与しておくのがベターだと思います。

Mac の場合は、 sf-pwgen を使って読みやすいアルファベットの羅列を生成できます。

takuya@Desktop$ sf-pwgen -a memorable -a letters -l  15
itwitichyozcyic
tecelyuprakamui
nivoujicloipher
eweogozadgeerho
ausholdubiishai

www-adminwebuser などわかりやすい文字列の後ろに追記しておくと良いでしょう。

www-admin などは容易に攻撃対象になるので、ユーザー名を難解で憶測困難なものにしておくほうが良いでしょう。

今回は webuserに文字列を付けて webuser-ausholdubiishai としました。

SFTPを使う人相手に公開鍵認証を説明するのも面倒な話だし。パスワード認証を使いたいよねやっぱり。

sudo adduser  webuser-ausholdubiishai
sudo adduser  webuser-nivoujicloipher

グループも作っておきます。

sudo addgroup webusers
sudo usermod -aG  webusers webuser-ausholdubiishai
sudo usermod -aG webusers webuser-nivoujicloipher

共有するフォルダのパーミッションを、グループを強制しておきます。これで他ユーザーのファイルが消せないとかは減る。umask でもいいけど。

sudo chmod g+srwx /var/www/webusers

SFTPの設定

SFTP の設定をしたいユーザー名に次のような設定を書きます。

/etc/ssh/sshd_config

## currently only sftp user
Subsystem sftp /usr/lib/openssh/sftp-server
match user webuser-ausholdubiishai
  PasswordAuthentication yes
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
  ChrootDirectory /var/www/

一つずつ見ておきます。

Subsystem sftp /usr/lib/openssh/sftp-server

これは、SSHの内部SFTPサーバーを有効にします。標準で入っています

match user

match user webuser-ausholdubiishai ユーザー名がマッチした時にそれ以降の設定を上書きします。

match group or match user name*

複数ユーザーがいるときは、Match Groupワイルドカードが便利です。

PasswordAuthentication yes

パスワードログインを許可します。

X11Forwarding ForceCommand AllowTcpForwarding

  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp

ここでは、通常のSSHで出来るようなシェル機能を無効にしておきます。ログインしたら シェルとして sftp サーバーを起動するようにしておきます。

ChrootDirectory /var/www/

SFTPでアクセスしたときに Chroot を掛けて、指定のフォルダ以降のアクセスに限定します。

ディレクトリのアクセス制限

chroot したいディレクトリのパーミッションを root:root で 755 にします。

 ll -d /var/www
drwxr-xr-x 5 root root 4096 Dec  7 18:46 /var/www/

もしコレを忘れると、切断されて broken pipe などとエラーになったりします。

忘れた場合のログです。 /var/log/auth

Aug  9 04:00:29 acid sshd[6185]: fatal: bad ownership or modes for chroot directory
sudo chmod 755 /var/www/path/to/chroot
sudo chown root:root /var/www/path/to/chroot

こうですね。

最後に再起動

ssh をリロード(再起動)して終わりです。

systemctl reload ssh 

これで完了

まとめ

パーミッションにハマるとしんどい。最初に知っておけばよかった。

SFTPは各種ソフトが対応していてファイルの転送だけを考えれば、使いやすい。

ユーザー名とパスワードを考えるのが面倒なのでユーザー名自動生成でアルファベット的に読めるものを自動生成はうれしいですね。

あと、chroot は便宜的なもので過信してはいけない。

今時なら、SFTPを使わずCIまわして自動デプロイか自動docker なんだろうけどさ。

2018-08-09

エラー・メッセージを追記

Macのワイヤレス診断の使い方

Wireless diagnostics(ワイヤレス診断)にはメニューがある

いつも忘れるので、メモをしておく

Wireless diagnosticsを起動したら、ウインドウメニューを開く

f:id:takuya_1st:20171208182650p:plain

すると、各種メニューが出てくる

写真は、チャンネルごとにSSIDを閲覧する方法。

f:id:takuya_1st:20171208182822p:plain

他にも色々見られる

ノイズとRSSIの変化を見たり

f:id:takuya_1st:20171208183029p:plain

WiFIをスニッファモードにしたり

f:id:takuya_1st:20171208183131p:plain

いつも存在を忘れる。

WiFiが複数バンド(5/2.4GHz)で飛んでるときに、明示的に2.4GHz のssidに接続する

macWiFi接続で 2.4Ghz を強制してみた

CoreWLANで 同一SSIDで 2.4 / 5 GHz が飛んでいる場合に、2.4GHz に接続をしてみた。

人が多い時に、あきらかに5GHzが使われて、2GHz帯が空いてそうなので、一度接続してみたいなと思って。

接続しようにもMacが5GHzを使うので、選択できないなと。CoreWLANを読んでたら、明示的につなげそうだったので、繋いでみた。

//
//  main.m
//  WiFi-testing
//
//  Created by takuya on 20171130.
//  Copyright © 2017年 takuya. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreWLAN/CoreWLAN.h>
int main(int argc, const char * argv[]) {
  @autoreleasepool {

    CWWiFiClient *cw = [CWWiFiClient sharedWiFiClient];
    CWInterface *ci = cw.interface;
    NSSet *set = [ci scanForNetworksWithName:@"00_MCD-FREE-WIFI" error:NULL];

    // 2,4GHz is wlanChannel.channelBand == 1
    NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"wlanChannel.channelBand == 1 ",set];
    CWNetwork *target = [[set filteredSetUsingPredicate:pred2] anyObject];
    printf("\nThe target is %s\n", [target.bssid UTF8String]);
        for (CWNetwork *i in set) {
          printf("%25s %8s %s % 5ld % 5ld % 5ld % 5lddBm \n",
                 [i.ssid UTF8String],
                 //2=>5Ghz 1=>2.4Ghz
                 ((i.wlanChannel.channelBand==kCWChannelBand5GHz)? "5GHz" : "2.4GHz"),
                 [i.bssid UTF8String],
                 i.rssiValue,
                 i.wlanChannel.channelWidth,
                 i.wlanChannel.channelNumber,
                 i.noiseMeasurement
                 );
        }


    [ci disassociate];
    [ci setPower:YES error:NULL];
    [ci disassociate];
    [ci setWLANChannel:target.wlanChannel error:NULL]; //チャンネルのデフォルトを2.4GHzにする
    [ci associateToNetwork:target password:NULL error:NULL];

  }
  return 0;
}

一応つながる

f:id:takuya_1st:20171208180446p:plain

しかし、すぐに5Ghzにされる。

しかし、接続中に、Macに2.4GHz → 5GHz にされてしまう。

同一SSIDで5GHzが飛んでたらそっちへつなぎ替えるプロセスが居るらしい。どれだ。。。

なんな、launchd から起動されているDAEMONを止めないとダメっぽいぞ。