それマグで!

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

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

php で pam を使う(ってはいけない)

php から ログインに Linuxのユーザー名&パスワードを使ってみよう

Linux のログインには、PAMが使われるのが一般的。 PAM を使うことでLinuxのユーザー名で認証ができる。

今回は PHPの pam を使って認証してみる

ただし、このやり方は試験的にやってるのであっていかなる時も、公開用本番サーバーに適用してはいけない。

準備

準備するのは次のモノを準備する。

  • php-pam
  • php.ini
  • pam.d
  • shadow

php-pam のインストール

インストールはいつものとおり、拡張機能のインストール手順でやる。

curl https://pecl.php.net/get/pam-1.0.3.tgz | tar zxvf -
cd pam-1.0.3
phpize
./configure && make && make test
sudo make install

php.ini の設定を作る

php.ini の設定でextension をロードするように作ります。

sudo sh -c "echo extensions=pam.so > /etc/php/conf.d/pam.ini"

apache の再起動

ここで、Apacheの再起動。

再起動して pam がロードされたか確認する。

pam.d を作る

sudo sh -c "@include common-auth > /etc/pam.d/php"

PAM 側に PHP が利用できる pam の設定を書いておく。PHPがPAMに認証を訊くとき、どのように認証するかここで決める。

最後に apahce が shadow を読めるようにする

ココが危険なんだけどさ。。。

sudo usermod -aG shadow apache

Apache が /etc/shadow ファイルを閲覧できるようにする。

危険すぎて公開サーバーでやると大変な目に遭う。

最後に php から pamを使う

<?php 
$error = "";
$res = pam_auth("takuya_1st", "password", $error) ;

if ( $res ){
 echo "ok"
} else {
var_dump( $error );
}

これで全部できる。

でも、安全に使えない

Apacheに mod_php を入れている状態では、全てのphp コードが、 apacheユーザーで動作している。

だから、apacheユーザーに /etc/shadow の読取り権限を与えると、とても危険。

echo file_get_contents("/etc/shadow");

はい、読めます読めます。

まぁ、shadow ファイルからパスワードが漏れることはないんだけど。

shadow は万が一の危険のために、一般ユーザーから見えない場所に、隔離してハッシュ値を保存しています。

apache は mod_php で任意のプログラムを「容易」に実行できる。容易にshadow ファイルを読めてしまう。

だれでもphpファイルを自由に配置できるってことが多い状況下では

これでは、大変困りますね。安全障壁を1つ減らすのですから。

ハッシュが漏れたら危険なのは、レインボーテーブルの存在です。カンタンなパスワードだと突き止められてしまいます。

ではどうするか。

php でどうしてもやりたいなら php-cgi で setuid ですかね。それか suexec を掛けるしかない。

それか、諦めて、shadowパーミッションをつける。まぁハッシュテーブルだし漏れたとしても。即死レベルの危険じゃないし・・・。

それか、mysql をPAM 化して、 pdo コネクションを作って見る。

それか、true/falseを返すだけのシェルを作る。

php pam で検索すると、Stack overflow などにも pam 使えと気軽な感じに書いてあって、php'er のヤンチャぶりを感じました。

Mac の文字化けする日本語の文字(濁点)を一括して文字コード変換する

Mac OSXの濁点・半濁点問題。

濁点をどう扱うか問題。Mac OSXの HFS がUTF-8で保存するんだけど、濁点と文字を別に保存する。

ぜっけい→ せ゛っけい
とくべつれっしゃ→とくへ゛つれっしゃ

のように保存する。正しいとか悪いとか別にどうでもいいんだ。コレはコレで有りだと思うし。選択肢が多いのはいいことだし。

けど。文字列一致検索で引っかからなかったり、正規表現で掛からなかったりするのが困る。。。そういうのは、OS側でサポートしてほしいなと思うんだけど、サポートしてないからなんとかするしかない。

変換するコマンド 作った

rubyでぱぱっと濁点を直すように書き換えた。

utf8-mac-normalize

#!/usr/bin/env ruby
if  ARGV.size > 0    then
  ARGV.each{|e|
    str = "#{e}"
    puts str.encode!("utf-8", "utf-8-mac")
  }
else
  STDIN.each_line {  |line|
    puts line.encode!("utf-8", "utf-8-mac")
  }
end

これで簡単にできる。

コマンドの使い方

ls の結果をフィルタリングする。

ls | ./utf8-mac-normalize

find コマンドと組み合わせて

find -mtime 2 -exec  ./utf8-mac-normalize {} \;

などと出来る。

ファイルを名を正規化して、濁点を修正するには

ファイル名を正規化する場合は

for i in $(ls  /path/to/dir ) ;  
do 
    mv  "$i"  "$(utf8-mac-normalize $i  )" ; 
done ;

などとヤって一括してファイル名を揃える。ただし、空白を含むファイル名などには for だけでは対応できないのでIFSか、findを使う。

ファイル名に空白が含まれる場合。

IFS=$'\n'
for i in $(ls  ./ ) ;   do   mv  "$i"  "$( utf8-mac-normalize $i  )" ;  done ;

find/xargs は back quote とともに使えないっぽいので見送り

あれ?iconv を使わないの?

iconvコマンドは環境によって、手に入るてにはいらないかわからないじゃん?てかインストール面倒だし。。。

iconv の場合は次のようにする

ls |  iconv -f utf-8-mac -t utf-8

iconv が NFD に非対応だったので、今回rubyにした。

私のDebianは非対応だった・・・くっそ

ちなみに UTF8-MAC って?

正式名称じゃないです。慣用的に使われているやつです。 MSの932をShfit-JISと読んでる様な感じでしょうね。

HFS/HFS+ のファイルシステムで使われているので、 UTF-8-HFS と呼ばれることもあるようです。

だから、ファイル名 で主に登場します。気にしすぎは禁物、ブログ投稿画面とかでチェック必要ないからね。

2016-08-02

コマンドのミスを加筆修正

参考資料

http://tama-san.com/utf-8-mac_1/

http://blog.sarabande.jp/post/78293914880

Linux ディレクトリのパーミッション のおさらい

linuxディレクトリのパーミッション

普段意識しないんですが、改めて、調べなおしてみることした

間違ってるかもしれないので、ご指摘いただけると助かります。

Linuxディレクトリの 001(x): execute フラグ

Linuxディレクトリに実行フラグが立っている、立っていないのはなし。

ディレクトリに -x した場合

ディレクトリの内部のエントリ全てにアクセス権を剥奪する。

test/ #  ここを -x する
├── a 
└── bb # サブディレクトリも見えない!
    └── b1

test から x をオフにすると

chmod a-x test

test 以下のファイル全てにアクセス権を失うことになる。

なぜなのか?ディレクトリのパーミッションを探すときに上位ディレクトリから当たる

ls /var/www/test//bb/b1

この場合

  1. /var/
  2. /var/www/
  3. /var/www/test/ ## ここで拒否される
  4. /var/www/test/bb
  5. /var/www/test/bb/b1

この順で、パーミッションが探される。このとき /var/www/test/ で拒否される。

ディレクトリに -r をした場合

ディレクトリの直下エントリ列挙を不能にする

ディレクトリから read を削除すると。

chmod a-r test

こうなる。

test/ # このディレクトリのr は不可能
├── a
└── bb ## ここは読める
    └── b1

一覧が出来ないので、test/bb の存在を知ることが出来ない。 なので、事前に通知している人だけがアクセスできる。(でも総当りできるし完全な隠蔽の意味には不十分だ)

レアケースだが、次のようなパーミッションも存在できる。

others は 読めて、 owner(user)が読めない場合。

takuya@atom:/var/www$ ll test
ls: ディレクトリ test を開くことが出来ません: 許可がありません
takuya@atom:/var/www$ ll -dl   test/
d-wxrwsrwx 3 takuya www-data 4096  5月 27 14:47 test/

othersで読めるので読めそうなものだけど、user の拒否のほうが優先する。誰でも読めるのに、自分だけが読めない。

ディレクトリを w (writable)にすると?

ディレクトリの内部のファイルを( create new , rename ) 出来る。「rename/mv 出来る」は 新規作成と削除ができることと同じ。

まとめる

パーミッション 文字 影響 cd ls
read - ディレクトリ自体の中身一覧を読み取れる。子孫には影響しない。 不可
read r ディレクトリの中身を見みられる
write - ディレクトリ中身を編集できない - -
write w ディレクトリ中身を編集できる - -
execute - ディレクトリの中にアクセスをさせない、子孫にも影響する 不可 不可
execute x ディレクトリの中にアクセスできる "r" による

覚え方

種類 read write execute
ファイル 読む 書く 実行
ディレクト 一覧表示 書き込み 立ち入り

こんな感じ

ちなみに、細いものは、次の通り。

  • copy = 書く(読み込み+ファイル作成)
  • 削除=書く(ディレクトリに書込)
  • 追記 =書く
  • 移動 = 読む+書く≒コピーして削除

このあたりを細かく制御するには chattr を使います。その話はまたどこかで

参考資料

https://wiki.archlinux.org/index.php/File_permissions_and_attributes

iOS シミュレータだけを起動する(Xcode7)instruments

instruments コマンドでiOS シミュレータを起動する

takuya@~/Desktop$ xcrun instruments -s
Known Devices:
rena [64B86A64-E9A9-50E2-9605-314FE1BF2387]
iPad 2 (9.0) [24195A52-91D1-469D-98E8-B9FBE4F957EB] (Simulator)
iPad Air (9.0) [822C303E-DD38-4B6D-9C4A-0C3558896684] (Simulator)
iPad Air 2 (9.0) [18F87714-EB72-47E0-AEAC-81DCE7C6BD57] (Simulator)
iPad Retina (9.0) [16D197CE-8B41-45C6-A9BD-EB7F12D6FD95] (Simulator)
iPhone 4s (9.0) [4AD7F520-0550-4E98-8961-4E74EC1A9577] (Simulator)
iPhone 5 (9.0) [549A15D3-3496-44C9-9409-C1D934116F1A] (Simulator)
iPhone 5s (9.0) [286C2C87-9A6E-4FBB-AF33-FC2E61051A6E] (Simulator)
iPhone 6 (9.0) [4D18598F-FE49-4EF0-878D-F464B64AD728] (Simulator)
iPhone 6 Plus (9.0) [E5025B7C-0A30-40CB-99F9-131017209AA6] (Simulator)
iPhone 6s (9.0) [5984338B-FB8F-43E9-8E48-559BC9C9F57D] (Simulator)
iPhone 6s Plus (9.0) [6F4C1121-997C-40D4-A406-7D32C6BE8829] (Simulator)
Known Templates:
"Activity Monitor"
"Allocations"

指定したデバイスを起動する

xcrun instruments -w "iPhone 6 Plus (9.0) [E5025B7C-0A30-40CB-99F9-131017209AA6] (Simulator)"
Instruments Usage Error: No template (-t) specified
instruments, version 7.3 (60134)

参考資料

https://stackoverflow.com/questions/26031601/xcode-6-launch-simulator-from-command-line

iOS シミュレータだけを起動する(Xcode7)simctl

条件 説明 -n 文字列が存在すれば真 -z 文字列が存在しなければ真 -d ディレクトリが存在すれば真 -f ファイルが存在すれば真 -s ファイルが存在し、かつファイルサイズが0でなければ真 -e ディレクトリかファイルが存在すれば真 -r ファイルが読み込み可能であれば真 -w ファイルが書き込み可能であれば真 -x ファイルが実行可能であれば真

http://www.boaro.jp/linux/bash/bash_script.html

iOS シミュレータが直接起動できないっぽい

むかしは直接起動できたけど、管理方法がアレコレ変わって直接起動が出来ない。

iOS のプロファイル(OSイメージ)一覧を出力する

iOS のプロファイル管理は 次の場所にある。

~/Library/Developer/CoreSimulator/Devices/

ちなみに、私のOSXでは次のようになっていた。

takuya@~/Desktop$ ll ~/Library/Developer/CoreSimulator/Devices/
total 8
drwxr-xr-x 4 takuya staff  136  5 21 22:57 16D197CE-8B41-45C6-A9BD-EB7F12D6FD95
drwxr-xr-x 4 takuya staff  136  5 21 22:57 18F87714-EB72-47E0-AEAC-81DCE7C6BD57
drwxr-xr-x 4 takuya staff  136  5 21 22:57 24195A52-91D1-469D-98E8-B9FBE4F957EB
drwxr-xr-x 4 takuya staff  136  5 26 22:45 286C2C87-9A6E-4FBB-AF33-FC2E61051A6E
drwxr-xr-x 4 takuya staff  136  5 21 22:57 4AD7F520-0550-4E98-8961-4E74EC1A9577
drwxr-xr-x 4 takuya staff  136  5 21 22:57 4D18598F-FE49-4EF0-878D-F464B64AD728
drwxr-xr-x 4 takuya staff  136  5 21 22:57 549A15D3-3496-44C9-9409-C1D934116F1A
drwxr-xr-x 4 takuya staff  136  5 21 22:57 5984338B-FB8F-43E9-8E48-559BC9C9F57D
drwxr-xr-x 4 takuya staff  136  5 21 22:57 6F4C1121-997C-40D4-A406-7D32C6BE8829
drwxr-xr-x 4 takuya staff  136  5 21 22:57 822C303E-DD38-4B6D-9C4A-0C3558896684
drwxr-xr-x 4 takuya staff  136  5 21 22:57 E5025B7C-0A30-40CB-99F9-131017209AA6
-rw-r--r-- 1 takuya staff 5819  5 25 13:15 device_set.plist

でもこんなが見られても、嬉しい人はあまりいないと思う。

イメージ一覧を出力する simctl

先ほどのディレクトリの中身は次のコマンドで行う。*1

xcrun simctl list

list をすることで一覧を見ることが出来ます。

takuya@~/Desktop$ xcrun simctl list
== Device Types ==
iPhone 4s (com.apple.CoreSimulator.SimDeviceType.iPhone-4s)
iPhone 5 (com.apple.CoreSimulator.SimDeviceType.iPhone-5)
iPhone 5s (com.apple.CoreSimulator.SimDeviceType.iPhone-5s)
iPhone 6 (com.apple.CoreSimulator.SimDeviceType.iPhone-6)
iPhone 6 Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6-Plus)
iPhone 6s (com.apple.CoreSimulator.SimDeviceType.iPhone-6s)
iPhone 6s Plus (com.apple.CoreSimulator.SimDeviceType.iPhone-6s-Plus)
iPad 2 (com.apple.CoreSimulator.SimDeviceType.iPad-2)
iPad Retina (com.apple.CoreSimulator.SimDeviceType.iPad-Retina)
iPad Air (com.apple.CoreSimulator.SimDeviceType.iPad-Air)
iPad Air 2 (com.apple.CoreSimulator.SimDeviceType.iPad-Air-2)
iPad Pro (com.apple.CoreSimulator.SimDeviceType.iPad-Pro)
Apple TV 1080p (com.apple.CoreSimulator.SimDeviceType.Apple-TV-1080p)
Apple Watch - 38mm (com.apple.CoreSimulator.SimDeviceType.Apple-Watch-38mm)
Apple Watch - 42mm (com.apple.CoreSimulator.SimDeviceType.Apple-Watch-42mm)
== Runtimes ==
iOS 9.0 (9.0 - 13A344) (com.apple.CoreSimulator.SimRuntime.iOS-9-0)
iOS 9.3 (9.3 - 13E230) (com.apple.CoreSimulator.SimRuntime.iOS-9-3)
tvOS 9.2 (9.2 - 13Y227) (com.apple.CoreSimulator.SimRuntime.tvOS-9-2)
watchOS 2.2 (2.2 - 13V143) (com.apple.CoreSimulator.SimRuntime.watchOS-2-2)
== Devices ==
-- iOS 9.0 --
    iPhone 4s (4AD7F520-0550-4E98-8961-4E74EC1A9577) (Shutdown)
    iPhone 5 (549A15D3-3496-44C9-9409-C1D934116F1A) (Shutdown)
    iPhone 5s (286C2C87-9A6E-4FBB-AF33-FC2E61051A6E) (Booted)
    iPhone 6 (4D18598F-FE49-4EF0-878D-F464B64AD728) (Shutdown)
    iPhone 6 Plus (E5025B7C-0A30-40CB-99F9-131017209AA6) (Shutdown)
    iPhone 6s (5984338B-FB8F-43E9-8E48-559BC9C9F57D) (Shutdown)
    iPhone 6s Plus (6F4C1121-997C-40D4-A406-7D32C6BE8829) (Shutdown)
    iPad 2 (24195A52-91D1-469D-98E8-B9FBE4F957EB) (Shutdown)
    iPad Retina (16D197CE-8B41-45C6-A9BD-EB7F12D6FD95) (Shutdown)
    iPad Air (822C303E-DD38-4B6D-9C4A-0C3558896684) (Shutdown)
    iPad Air 2 (18F87714-EB72-47E0-AEAC-81DCE7C6BD57) (Shutdown)
-- iOS 9.3 --
-- tvOS 9.2 --
-- watchOS 2.2 --
== Device Pairs ==

先ほど~/Library で確認したデバイスがチャント確認できます。こちらは、iOS と 機種名で強い

xcrun が見つからない時は。

xcrun は xcode 内蔵のコマンドを実行します。simctl も xcrun も次の場所にありました。

/Applications/Xcode.app/Contents/Developer/usr/bin

シミュレータを起動する(バックグラウンド)

シミュレータを起動するには次のようにします。

xcrun simctl shutdown 286C2C87-9A6E-4FBB-AF33-FC2E61051A6E

すると xcrun simctl の結果が次のように変わります。

iPhone 5s (286C2C87-9A6E-4FBB-AF33-FC2E61051A6E) (Shutdown)
iPhone 5s (286C2C87-9A6E-4FBB-AF33-FC2E61051A6E) (Booted)

でも、GUIは起動しません。

Simulator のGUIを起動する。

Simulator app を起動するには、次のように変わります。

open -a "Simulator" --args 286C2C87-9A6E-4FBB-AF33-FC2E61051A6E

これで無事にシミュレータが起動します。

やったね。

f:id:takuya_1st:20160526230416j:plain

simctl は他にも次のように使える

Usage: simctl [--noxpc] [--set <set path>] <subcommand> ... | help [subcommand]
Command line utility to control the Simulator

For subcommands that require a <device> argument, you may specify a device UDID
or the special "booted" string which will cause simctl to pick a booted device.
If multiple devices are booted when the "booted" device is selected, simctl
will choose one of them.

Subcommands:
    create              Create a new device.
    delete              Delete a device or all unavailable devices.
    pair                Create a new watch and phone pair.
    unpair              Unpair a watch and phone pair.
    pair_activate       Set a given pair as active.
    erase               Erase a device's contents and settings.
    boot                Boot a device.
    shutdown            Shutdown a device.
    rename              Rename a device.
    getenv              Print an environment variable from a running device.
    openurl             Open a URL in a device.
    addphoto            Add photos to the photo library of a device.
    addvideo            Add videos to the photo library of a device.
    install             Install an app on a device.
    uninstall           Uninstall an app from a device.
    get_app_container   Print the path of the intsalled app's container
    launch              Launch an application by identifier on a device.
    spawn               Spawn a process on a device.
    list                List available devices, device types, runtimes, or device pairs.
    icloud_sync         Trigger iCloud sync on a device.
    help                Prints the usage for a given subcommand.

個人的には openurl とかめっちゃ楽じゃん。と思った。

iOS 楽しい。

*1: 調査中にパスが覚えられないとか行ってるqiitaの記事見つけてそっ閉じした。

php で prototype チェーン的なことをする

php で prototype 的なことをやろうと思った。

php の rar をExtendsしようとしたけど、extends できない

<?php
class RarByEntryName /* extends RarArchive */ { //←Extendsしたいけどfinal 出来ない

}

final で拡張を閉じられている。どうするか?

継承できないなら 移譲する。

継承できないものは、移譲する。これデザインパターン入門でならいました。

<?php
class RarByEntryName /* extends RarArchive */ { //←Extendsしたいけど出来ない

  protected $super;

  //  親クラスのフリをさせる移譲
  public function __get($name){
    if(property_exists($this,$name)) {
      return $this->$name;
    }
    // 移譲
    if(property_exists($this->super,$name)) {
      return $this->super->$name;
    }
    // 移譲
    $ret = $this->super->$name;
    if( $ret ){
      return $ret;
    }
    throw new Exception("Undefined property {$name}");
  }
  //メソッド移譲
  public function __call($name, $args){
    return call_user_func_array([ $this->super, $name], $args );
  }
}

これってメソッドチェーン・・・

これって、移譲パターンというよりプロトタイプパターンに見えてきた。

ああ、だから、Javascriptってクラスの継承がないのか。

<?php

class prototype {
  public function __get($name){
    if(property_exists($this,$name)) {
      return $this->$name;
    }
    // 移譲
    if(property_exists($this->super,$name)) {
      return $this->super->$name;
    }
    // 移譲
    $ret = $this->super->$name;
    if( $ret ){
      return $ret;
    }
    throw new Exception("Undefined property {$name}");
  }
  //メソッド移譲
  public function __call($name, $args){
    return call_user_func_array([ $this->super, $name], $args );
  }
}

class A  extends prototype {
   public function __construct(){
        $this->super = new PDO("sqlite:./test.db");
   }
}
class B  extends prototype {
   public function __construct(){
        $this->super = new A();
   }
}
class C  extends prototype {
   public function __construct(){
        $this->super = new B();
   }
}



$c = new C();

これで、C -> B -> A -> PDO の関係を作ることが出来る

実際にヤってみた

<?php
$c = new C();
$sh = $c->prepare("select * from users where name = :name ;");

var_dump($sh);
object(PDOStatement)#5 (1) {
  ["queryString"]=>
  string(40) "select * from users where name = :name ;"
}

ちゃんと、プロトタイプでメソッドチェーンを構成できた。ダイヤモンド継承的なことができてる。

ああ、だから動的型付け言語にはクラスがあってないようなものなのね。

クラスで欲しいのは、変数(関数)の束縛と変数(関数)の名前空間とスコープだわ。

究極的にはスクリプト言語は継承が「いつでも作れる」だからJSはああいう削ぎ落とした構成なんだ。

JSはプロトタイプベース。ちょっとだけわかったキガス。

rewrite は inherit をつけて上位フォルダから継承させる

rewrite が適用されない

rewrite って上位フォルダから適用されるんじゃないんですね。。。

mod_rewrite は継承させる必要がある。

rewrite のルールは、上位から下位フォルダに対して継承させないと、そのフォルダでしか有効にならない。

これらのフォルダが有るとき

public_html/
└── myapp
    ├── .htaccess
    └── webroot
        └── .htaccess

2 directories, 2 files

この下位フォルダは上位フォルダのRewriteの影響を受けないことがある。

どうするか

inherit する

継承させることが出来る

RewriteOption inherit 

これを書くと上位フォルダから順にrewrite が適用される。

各場所は上位フォルダ・下位フォルダのいずれでも良い。

上位フォルダに記述すると下位フォルダ全部

下位フォルダに記述するとその下位フォルダだけ上位フォルダから継承してくる。

Rewriteは、良くわからない現代魔法になってるよね・・・

CakePHPのサンプルとかにrewrite 一杯出てくるんだけど inherit しないからややこしくなってるような気がする。

重要なのはアクセス権について

上位フォルダのrewrite / .htaccessで設定したアクセス権を下位フォルダに適用させたいとき、コレが重宝される。

rewrite でアクセス制限やauth してると下層ディレクトリに適用されなくて悩んだ結果、コレが原因だとわかった。

2016/07/21

追記

オレオレ拡張機能をインストールしろという三井住友銀行(セキュアブレインの脆弱なセキュリティ)

三井住友銀行を見てたんですよ。

三井住友銀行が、セキュアブレイン社の、PhisWallをインストールしろ

PhishWallをインストールしろと書いてあって。

クソでした。

f:id:takuya_1st:20160523223613j:plain

Safari拡張機能は安全性を宣言するなら、列記とした証明書と署名が確認できる、拡張機能を配布するべきだ。

拡張機能配布がHTTP

しかも配布元が HTTP です。 HTTPS ですらありません。

しかも、配布説明のサイトも HTTP です。

いくらでも改善できる場所(HTTP)にオレオレ拡張機能を置いて、セキュアだとかどの口が言ってんだこいつら。

自社サイトで拡張機能を配布するから→当然未署名

とうぜん、オレオレ署名です。Safari拡張機能として不適合ですよね。

このようなことを防ぐためにSafari拡張はDeveloperIDと公式配布の必須化だったよね。。。

もしかしてApple審査通らない?通らないのようなものをインストールさせようとしてる?

セキュリティソフトをHTTPで配布すんな

セキュリティソフトのpkg を HTTP で配布する?改竄されたらどうすんだよコレ。

もしHTTPで配布するなら、配布元の署名を確認する方法掲載しておくべきですよね。

f:id:takuya_1st:20160523224259j:plain

私達はどうするべきか。

セキュリティやプライバシーに関する情報やソフトウェアをHTTPで配布しているのは疑ってかかる。

未署名のものは疑ってかかる。

OSが常に最上位に信頼できる。OS以上に信頼できるものは自分だけ。

OSを常に最新版にしておく、OSに従う。

OSのセキュリティ警告を無視して「OK押せ」という業者のは信用してはいけない。

セキュリティの基本は、 OSのセキュリティを守ることだ。

OSのセキュリティを危うくする行為をまるで「正当」であるかのように伝達する。嘘です。このような嘘やその場しのぎ対応を、セキュリティを商売にする人が言ってはいけない。

どうあるべきか

セキュリティソフトをHTTPで配布しているのが問題。

いますぐ配布ページをHTTPSに変えろ

インストールの説明(署名確認方法)が無いのが問題。

いますぐ、パッケージ署名確認方法を提示するか、

いますぐMac AppStoreで配布しろ

自社サイトで配布するなら、パッケージ署名の確認方法を掲載しろ!

拡張機能をHTTPで未署名配布するのやめろ

いますぐ、Safari拡張機能Safari拡張機能ギャラリー経由で配布しろ。

私達ができる パッケージ署名の確認方法

いますぐ私達ができるのは、パッケージ署名の確認をすることだ。

f:id:takuya_1st:20160523224458j:plain

f:id:takuya_1st:20160523224027j:plain

銀行関連はもうセキュリティ名乗るな

こんなものを「セキュア」だと曰わくのは、最低だと思う。

証明書と署名は、小学校で必修化したら良いと思う。

セキュリティを守る以前に、セキュアブレイン社のソフトが改竄に脆弱な形で配布されているのは、嘆かわしいことだ。

哀れな被害者が、偽セキュアブレインの偽フィッシング対策ソフトを入れさせる、偽セキュアブレイン社のフィッシングサイトに引っかかっても止める手段を講じてないんだから。それでもフィッシング対策なのか??

表示確認にcss outline は今でも主流なのかな?

とある、CSSを見てたんですよ。

CSSのボックス表示でエリアを確認するために、

  .debug {
    box-sizing: border-box;
  }
  .red  { border: solid 1px red;  }
  .green{ border: solid 1px green;  }

的なことを書いた grid-guide.css を見かけたんですよ。

表示確認なら outline でも良いと思うんだ。

outlineって要素の確認に使うんじゃなかったっけ?

.debug {
    outline: 2px dotted red; 
}

今はどっちを使うべきなんだろうか。

CSS3で border-box が導入されてから、outline の意義が薄まってるけど。レイアウトを確認するために、border-box をしていするのもなんか違う気がするし。

ユーザ登録の一括処理、新規登録を手早く(bulk create new users)

Linux に新規でユーザを登録したい。それもたくさん

5ユーザーを超えると流石に、管理しきれませんし、パスワードを生成するのも面倒くさい。何より登録が面倒くさい。

LDAPで認証連携をすればいいんだけど数10人程度でで認証連携ってのも面倒くさい。なによりLDAPにどうやって数十人もまとめて登録するんですか。

newuser コマンド があった

調べていたら newuser コマンドでバルク登録(大量一括)が出来ることが分かった。

以前にもnewuser コマンドを使って登録したが、以前は使い方が中途半端だったようでした。

newuser コマンド便利すぎてヤバイ。

newuser の使い方。

先にユーザーの一覧(ログインID,パスワード<平文>,ユーザーID,グループID, ホームディレクトリ, シェル) などを書いたファイルを用意しておく

# newusers user_passwd.list.txt

たったこれだけ。Debianで試したら、/etc/shadow にハッシュパスが登録されており、またホームディレクトリが生成されていた。感動した。

一覧ファイルの作り方

サンプルは次の通り

takuya01:my_password:2001:2001:takuya_1st:/home/takuya01:/bin/bash
takuya02:my_password:2002:2002:takuya_2nd:/home/takuya02:/bin/bash

この各項目は /etc/passwd 形式になっている。パスワードは平文でいいみたい。

項目 意味 サンプル
name ユーザーのログイン名 takuya
pass ユーザーのパスワード(平文) HJWb1q9aCLZq
UID ユーザのuid (数字) 2001
GID ユーザーgid(数字) 2001
GCOS フルネームなどユーザーメタ情報 木村拓哉
homeDir ホームディレクトリ /home/takuya
shell ログインシェル /bin/bash

このような項目を作って、:で接続してあげれば良いようだ。

UIDとGIDは、まぁ省略しても行けそうです。既存ユーザと衝突するとログイン名が異なるだけでファイルシステムやプロセス管理では同一ユーザーとして扱われてしまうので衝突には注意。

グループはどうするの?

同じようなコマンド。

# newgrp

が有ります。便利。

もしかして newuser で登録したらLDAPに投げてくれる?

useradd がそうなんだから LDAP に投げてくれそう。そのうち試したい。

関連資料

Linux の /etc/shadow 用 のパスワードを生成する。 - それマグで!

Linux ユーザーを一括登録&一括パスワード設定 - それマグで!

参考資料

http://www.cyberciti.biz/tips/linux-how-to-create-multiple-users-accounts-in-batch.html

Linux の /etc/shadow 用 のパスワードを生成する。

linux のユーザーパスワードをopenssl で生成できるらしい

openssl passwd -1  -salt  my_long_salt my_passwd

これで BSDなどで使われていた md5 ハッシュのパスワードを生成できるらしい。

みんな大好き!man ページ

passwd.1ssl のman です。

download-pdf

id コマンドの group 版。グループに所属しているユーザの一覧を取りたい

id コマンドで、ユーザーの詳細が出せますよね

$ id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)

id コマンドを使えば、ユーザがどのグループ、サブグループに所属しているか確認できます。

では、group を確認するにはどうすれば。

$ group www-data
bash: group: コマンドが見つかりません

そうなんですよ~。グループ名から、所属しているユーザー名をリストする方法がわからないんです。

groups コマンドは引数がユーザー名で、ユーザが所属しているグループを表示するだけで、 id コマンドと変わらないし

仕方ないので getent する

getent を alias するしかなかった。

$ alias group="getent group | /bin/grep "

alias しておけば

$ group www-data
www-data:x:33:takuya,daapd

表示することが出来る。

なぜ、getentをするのか。認証は/etc/{passwd,group}で管理されていると限らないからですね。

2016-05-21 追記

grep いらなかった。

getent group www-data

で絞り込みできたんだった。

alias group="getent group "

実際にヤってみた例

takuya@atom:~$ sudo getent group www-data
www-data:x:33:takuya,daapd
takuya@atom:~$ sudo getent group  sudo
sudo:x:27:takuya

iOS の容量のなぞ ー 本当になぞ。

iOS の容量表示が本当になぞ。

どこをどうみたらこの容量使ってるのか?

このような状況になると、初期化が一番手っ取り早いです。

初期化して、アカウントの設定だけ済ませればいい。

Safariのキャッシュやアプリ状態保存などのキャッシュが影響してるんだろうけど、削除する方法がないんだよね。

この状態で、容量不足と言われると、イラッと来る

f:id:takuya_1st:20160516224514p:plain

md2key を試してみた

markdown をkeynote に変えられるツール

k0kubun.hatenablog.com

markdown でスライド作れたら便利だよねと思っ試してみた。

使い方

  1. 変換したいmd ファイルを用意します。
  2. $>gem install md2keyを実行してインストール
  3. $>brew install highlight でハイライトパッケージを入れる
  4. 適当なKeynoteファイルを作る、テーマを適用して、2枚目にフォーカスしておく
  5. keynote を起動したまま、コマンドを開ける
  6. $> md2key sample.md で変換開始。

バババッっと変換されていく様は、爽快感がありました。

ある程度は綺麗になる。

フォーマットに沿ったものは綺麗になるし、良く出来てるん。

綺麗になるところは本当に綺麗になる。ハイライトも入る。

f:id:takuya_1st:20160516224110j:plain

用途に合う人は多いんじゃないかな。ぱぱっとプレゼン作るなら便利だと思う。

でもダメだった。

個人的にコレジャナイ感。

f:id:takuya_1st:20160516222607p:plain:w600 

私のマークダウン、画像が多かったり、BASE64でコンテンツ埋まってたりするからどうしても。。。

HTML でプレゼンかなやっぱ・・・

gfm で変換したり、CSS側で処理することにするよ。webkitFullscreen もあるし。

--- は不要じゃなねーんだよね。page-break after すれば印刷用PDFを経由してPDF資料にできるし。