2015年7月26日日曜日

VMWare Fusionの仮想マシンのバックアップ再考

VMWare Fusionの仮想マシンバックアップにTime Machineを用いる方法が、VMWare KBに紹介されている。
かいつまんで説明すると、VMWare Fusionに備わっているAuto Protectスナップショットという機能を用いることで仮想ディスク全体の更新を止め、変更分(スナップショット)のみ新規保存するようにすることで、Time Machineバックアップへの負荷を軽減するというものだ。

筆者も、半年ほど、この機能を使ってTime Machineに仮想マシンをバックアップしてきた。だが、止めることにした。バックアップ側ではなく、Mac本体にある仮想マシンのサイズが、実容量の倍以上に肥大してしまったからである。(履歴が残る分、バックアップ側はもっと大きい)

仮想マシンファイルはパッケージ形式で、中に仮想ディスクイメージがあるのだが、そこにあるスナップショットと思われるファイル群が、元の仮想ディスクと同じくらい容量を食っていた。
即刻VMWare Fusionのスナップショット管理ウインドウで、Auto Protectを止め、スナップショットを削除したところ、予想通り、仮想マシンファイルのサイズは、ほぼ半減した。

以前筆者は、仮想マシンバックアップに、rsyncというコマンドを使っていた。履歴を残したら大変なので、最新状態のみバックアップしていた。Time Machineを使えば履歴が残る。良さそうに思えたのでAuto Protectに浮気したが、やっぱりrsync戻るしかないと考えた。戻りついでに、手順を残しておくことにした。

Auto Protectがまずい理由を説明しようとして長くなった。ここからが本エントリの主題である。以下、rsyncの最新版ビルド、launchdシェルスクリプト、launchdプロパティリストの順に説明を進める。

  1. 仮想ディスクの分割
    仮想ディスクは分割しておくことをお勧めする。その方が、バックアップされるファイルの量が減るはずだ。
  2. rsyncの最新版ビルド
    rsyncの最新版は3.1.1である。対するにOS X Yosemite収録のrsyncは2.6.9で、2006年更新のものだ。ここではこちらの記事を参考に、OS Xが持つファイル属性がコピーできるものをビルド、インストールすることにする。
    curl -LO https://download.samba.org/pub/rsync/src/rsync-patches-3.1.1.tar.gz
    tar xf rsync-patches-3.1.1.tar.gz
    mv rsync-3.1.1/patches ./
    rm -rf rsync-3.1.1/
    curl -LO https://download.samba.org/pub/rsync/src/rsync-3.1.1.tar.gz
    tar xf rsync-3.1.1.tar.gz
    mv patches rsync-3.1.1/
    cd rsync-3.1.1/
    patch -p1 < patches/fileflags.diff
    patch -p1 < patches/crtimes.diff
    ./configure
    make
    sudo cp -pR rsync /usr/local/bin/rsync-311
    
  3. launchdシェルスクリプト
    次のシェルスクリプトは、rsync-311を用いて指定したディスクに仮想マシンの入ったフォルダごとコピーする。これをvm.backup.shというファイル名(例)で保存する。保存場所は任意だが、次項で使うので覚えておいて欲しい。
    #!/bin/sh
    
    
    # バックアップを置く外付けハードディスク名、およびフォルダ名を設定
    backUpHdd="ExternalHDDName"
    backUpPath=/Volumes/"$backUpHdd/"
    
    thePath="/Users/{Account Name}/Documents/Virtual Machines.localized"
    
    if [ -d "$thePath" -a -d "$backUpPath" ]; then
      Ver1=`Date`
      Ver2=`/usr/local/bin/rsync-311 -avNHAX --fileflags --force-change --delete --stats "$thePath" "$backUpPath"`
      echo $Ver1"\n\n$Ver2" > /tmp/vm.backup.log
    fi
    
    exit 0
    
    シェルスクリプトには、実行権限を付与する。
    chmod 755 vm.backup.sh
    
  4. 指定時間ごとにシェルスクリプトを実行するLaunchdプロパティリスト
    次のLaunchdプロパティリストは、外付けHDDのマウント時に6時間おきに仮想マシンをバックアップする。これをjp.yourName.vm.backup.plistというファイル名(例)で保存する。保存場所はホームディレクトリ > Library > LaunchAgentsである。
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
        <dict>
            <key>Label</key>
            <!-- yourNameを書き換える -->
            <string>jp.yourName.vm.backup</string>
            <key>ProgramArguments</key>
            <array>
                <!-- Account Nameを書き換える -->
                <string>/Users/{Account Name}/Library/LaunchAgentsScripts/vm.backup.sh</string>
            </array>
            <key>StartInterval</key>
            <!-- 数字をバックアップする時間間隔(秒)に書き換える -->
            <integer>21600</integer>
            <key>StandardErrorPath</key>
            <string>/tmp/StandardError.log</string>
            <key>StandardOutPath</key>
            <string>/dev/null</string>
        </dict>
    </plist>
    
    プロパティリストをLaunchdに登録する。
    launchctl load /Users/YourAccount/Library/LaunchAgents/jp.yourName.vm.backup.plist
    

以上の手順で、仮想マシンの最新状態のみ、Launchdプロパティリストで指定した時間間隔でバックアップされるようになる。時間間隔は、あまり細かすぎると、仮想マシンをいじりすぎて元に戻したい時などに困る。筆者は取り敢えず6時間を設定した。

なお、Time Machineバックアップからの仮想マシンバックアップ削除も実行した。これは通常のTime Machine操作方法と同じなので、ここでは説明していない。

VMWare Fusionの例で説明したが、VirtualBoxでも、仮想ディスクを分割すれば、この方法でバックアップできる。

2015年7月23日木曜日

"SUIDGuard.kext"補足

DYLD_PRINT_TO_FILEの権限昇格脆弱性に対する有志の対策である"SUIDGuard.kext"の存在そのものは、Appleちゃんねるさんが紹介しているのを読んで知った。
インストールは/System/Library/Extensionsにコピーするだけだと書いてある。
だが、コピーしただけでは読み込まれないと思う。少なくとも筆者の場合はそうだった。試したMacの台数は2台である。

機能拡張の入手先
これが失礼ながらAppleちゃんねるさんの記事では分かりにくい。筆者は関連リンクからXcodeのプロジェクトをダウンロードしてしまった。正しくは、こちらである。
ちなみにダウンロードするのは、SUIDGuard.kext.tar.bz2である。

機能拡張のインストール
よく知っている人には常識かも知れないが、失礼ながらAppleちゃんねるさんの記事では抜けている手順がある。以下説明する。

  1. ファイルの解凍
    これはさすがに常識レベルだと考える。説明が抜けているなどと言うつもりはない。
  2. 所有者権限の変更
    解凍した"SUIDGuard.kext"を/System/Library/Extensionsにコピーするだけでは、次のように表示されてしまう。

    ターミナルで次のようにして、所有者をrootとwheelにする。

    sudo chown -R root:wheel SUIDGuard.kext
    
  3. 機能拡張フォルダへの移動
    Finderでやっても構わないし、また次のようにターミナルで移動しても良い。

    sudo mv SUIDGuard.kext /System/Library/Extensions
    

    ただ、機能拡張フォルダに入れただけでは読み込まれず、次の図のようになる。

  4. 機能拡張の読み込み
    読み込みは、システムの再起動か、あるいは次のようにターミナルで読み込ませる必要がある。

    sudo kextload /System/Library/Extensions/SUIDGuard.kext
    

以上、Appleちゃんねるさんみたいにメジャーでない、冥王星のようなブログでこんな小言めいたことを書いても…とも思うが、念のために補足しておく。

それにしても、キーチェーンの件といい、本件のDYLD_PRINT_TO_FILEの権限昇格脆弱性といい、最近のAppleは抜けが多すぎる。そして何より問題なのは、発覚した問題を放置することだ。
筆者のブログは小言めいた記事が多いが、だからと言ってAppleが嫌いなわけではない。逆に好きだからこそ、ちゃんとやって欲しいのだ。

2015.08.16追記

  1. 本記事の内容だけでは、OSを再起動した際にSUIDGuard.kextが読み込まれない。再起動後にも読み込まれるものがパッケージ形式で配布されている。(SUIDGuardNG-Installer.pkg、またはSUIDGuardNG.dmgをダウンロードする)
  2. OS X 10.10.5でDYLD_PRINT_TO_FILEの権限昇格脆弱性の問題は修正されたが、何やらきな臭い。動向はAppleちゃんねるさんなどで報告されると思われるので、注視されたい。問題が完全に修正されるまでは、SUIDGuardNGをアンインストールしない方が良さそうだ。

星とラブの困惑からの脱出 - iTunes 12.2

Appleは、iTunes 12.2から、従来の星によるレーティングに加え、Loveというレーティングを追加した。
これは、Apple Musicへの対応に伴うものだそうだ。Loveしたトラックまたはアルバムから、Apple Musicでのオススメを作り出すためのモノらしい。

なぜ、今回Appleは、過去の遺産も必要とあればバッサリ切る、いつもの方針を示さなかったのだろうか?
例えば、技術的には、星によるレーティングで、星いくつ以上ならばLoveにするというような機能を持たせることは、可能だったはずだ。

こういう中途半端な事をすると、すぐにこんな記事が書かれることになる。記事は英語で、筆者も辞書を引きながら読んだ箇所もあるが、爆笑モノだ。一読をお勧めする。(笑)

冗談はさて置いて、確かに、図のように、トラックまたはアルバムの評価基準を選択する設定はある。だから、レガシーな星によるレーティングをいじらないまま、見えなくする事はできる。

だが、見かけ上の操作ができるとしても、星かラブのどちらかにするか、あるいは、可能であれば星からラブへの移行がしたいと思った。別にApple Musicを使うつもりだからではなく、評価基準を統一したいと思ったのだ。

星からラブへの移行
冒頭にも書いた通り、iTunes自体にこの機能が欲しかった。だが、今のところはない。調べてみると、星の方はiTunes Library.xmlに記録されているのだが、ラブはなかった。
すわっ、Objective-Cで何か作らなきゃと思ったのは愚かだった。多分、その方が処理速度は早いだろう。だが、速度はさておき、手軽な手段を忘れていた。AppleScriptである。

次のAppleScriptは、ラブにする星の数を設定し、また、星からラブに移行するかどうかも選択できる。(掲載例は移行しない設定)

-- ラブにする星の数(実際は整数値)を設定。数値と星の対応:20=★, 40=★★, 60=★★★, 80=★★★★,  100=★★★★★
set thresholdRating to 80

-- ラブに移行する場合はtrue、移行しない場合はfalse
set delteteStar to false

set trackCount to 0

tell application "iTunes"

    -- iTunesのバージョンチェック。ラブは12.2以降。
    considering numeric strings
    set newEnough to version ≥ "12.2"
    end considering
    
    if newEnough then
        
        -- 総トラック数の算出
        set totalTracks to (every file track)
        set totalTracksCount to count totalTracks
        
        repeat with aTrack in totalTracks
            
            set trackRating to rating of aTrack
            
            -- レーティングがゼロでなければ処理
            if trackRating ≠ 0 then
                
                -- 設定★数以上の場合はラブにする
                if trackRating ≥ thresholdRating then set loved of aTrack to true
                
                -- ラブに移行する場合はレーティングをゼロにする
                if delteteStar then set rating of aTrack to 0
                
            end if
            
            -- カウンターのインクリメント
            set trackCount to trackCount + 1
            
            -- メッセージ欄に進捗状況を出力
            log "Processing: " & trackCount & " of " & totalTracksCount
            
        end repeat
        
    end if

end tell

作業は、一時的に、iTunes 12.2(以降)の詳細環境設定で、iTunes ライブラリ XML を他のアプリケーションと共有をオフにしたほうが早い。

iTunesライブラリの各トラックに設定されている星をラブに置き換えるので、上図の表示設定とは関係なく実行できる。確認のため星とラブを表示しておくのも良し、ラブにしておくのも良し、お好みでどうぞ!

2015.07.25 改訂
AppleScriptにラブに移行する設定でも星が残ってしまうバグがあったので修正。

2015年7月22日水曜日

QLColorCodeに要注意!

QLColorCode(あえてリンクしない)という名前のQuickLookプラグインがある。ソースコードをQuickLookした時、プログラム言語特有の文字列を色付け(Syntax Hilighting)してくれる、プログラミングをする人間などには嬉しい機能を持っている。

ところが、このプラグインをインストールして、QuickLookでテキストを選択できるようにしていると、QuickLook画面上で選択した文字列のコピーができなくなる場合があるのだ。

問題が発生したのは、MacBook Pro Retina Early 2013とMacBook Air Early 2015、OSはYosemite 10.10.4である。同じOSでも、破棄予定の不調なMacBook Late 2009では発生しない。なぜ機種によって差があるのかはよく分からない。

ちなみに派生系と思われるQLColorCode-extraでも、同じ問題がある。

筆者はコピー&ペーストを多用する。当然のことながら、この機能に問題があるモノは、たとえ便利でも使わないことにした。

他の環境で問題が出るかどうかは分からない。だが、そういう事実があったことは記録しておくべきだと考え、このエントリを書いた。

2015.07.22 9:50 P.M.
内容が不明確なところ、間違いがあったので、加筆修正。

2015年7月21日火曜日

スパースバンドルの夢、再び

本ブログの最初の方にスパースバンドルの見果てぬ夢というエントリがある。Time Machineバックアップを、ローカルハードディスクに置いたスパースバンドル・ディスクイメージに保存できるかについて書いたものだ。

そういうことはできないというのが、当時の結論だった。

だが、最近、Time Capsuleに置いたスパースバンドル・ディスクイメージの振る舞いそのもの ー 必要な時にMacにマウントされ、バックアップが終わったら、マウント解除される ー は、無理な(ややこしい)ものの、似たような事はできる事が分かった。

本エントリでは、2年半強の時を経てたどり着いた、ローカルハードディスクに置いたスパースバンドル・ディスクイメージにTime Machineバックアップを保存する方法を説明したい。
なお、スパースバンドルについては、こちらに分かりやすい説明があったのでリンクしておく。

  1. スパースバンドル・ディスクイメージの作成
    イメージの作成自体はディスクユーティリティで次の図のようにすれば良い。イメージのサイズと名前はお好みである。図の例では、サイズを128GB、名前をTM_BackUpとしている。
  2. Time Machineを騙す
    Time Machine環境設定パネルからは、マウントされたディスクイメージをバックアップディスクとして選択することはできない。だが、次のようにターミナルから入力すると、認識させることができる。[情報ソース]
    sudo tmutil setdestination /Volumes/TM_BackUp
    
  3. ディスクイメージをマウントさせるシェルスクリプト
    ディスクイメージがマウントされていないと、自動バックアップはできない。手動ならできるが、それでは、筆者のようなモノグサ者には不満が残る。そこで、シェルスクリプトを使う。
    次のシェルスクリプトをAuto mount TM Image.shというファイル名(例)で保存する。保存場所は任意だが、次項で使うので覚えておいて欲しい。
    #!/bin/sh
    
    # Auto mount Time Machine disk image on Login.
    
    # ここは自分のバックアップHDDにする
    TM_Volume="/Volumes/Data 750GB"
    
    # ここは自分のディスクイメージ名にする
    Image_Name="TM_BackUp.sparsebundle"
    
    ImagePath="$TM_Volume"/"$Image_Name"
    
    Mount_Image="/Volumes/"`echo $Image_Name | cut -d . -f1`
    
    if [ -w "$ImagePath" -a  ! -d "$Mount_Image" ]; then 
        /usr/bin/hdiutil attach "$ImagePath"
    fi
    
    exit 0
    
    シェルスクリプトには、実行権限を付与する。
    chmod 755 "Auto mount TM Image.sh"
    
  4. ログイン時に、シェルスクリプトを実行するLaunchdプロパティリスト
    こういうことはLaunchd.plistにやってもらうのが手っ取り早い。
    次のプロパティリストをjp.yourName.tm_image.mount.plistというファイル名(例)で保存する。保存場所はホームディレクトリ > Library > LaunchAgentsである。
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
        <dict>
            <key>Label</key>
            <!-- yourNameを書き換える -->
            <string>jp.yourName.tm_image.mount</string>
            <key>KeepAlive</key>
            <dict>
                <key>PathState</key>
                <dict>
                    <!-- ExternalHDDNameを書き換える -->
                    <key>/Volumes/ExternalHDDName</key>
                    <true />
                </dict>
            </dict>
            <key>ProgramArguments</key>
            <array>
                <!-- シェルスクリプト保存場所を絶対パスで指定 -->
                <string>/Path/To/YourScript/Auto mount TM Image.sh</string>
            </array>
            <key>RunAtLoad</key>
            <true/>
            <key>StandardErrorPath</key>
            <string>/tmp/StandardError.log</string>
            <key>StandardOutPath</key>
            <string>/dev/null</string>
        </dict>
    </plist>
    
    プロパティリストをLaunchdに登録する。
    launchctl load /Users/YourAccount/Library/LaunchAgents/jp.yourName.tm_image.mount.plist
    

以上で、外付けローカルハードディスクに置いたディスクイメージにTime Machineバックアップが作成できるようになった。
ディスクイメージだから、上限サイズ(拡張も可能)は決まっている。すなわち、Time Machineによるハードディスクの使用容量制限ができることになる。

2015.07.23改訂
ディスクイメージがある外付けHDDのマウント状況に応じたLaunchd.plistの加筆修正。(HDDがマウントされたらシェルスクリプトを起動するという条件を追加)以下参照。

<key>KeepAlive</key>
<dict>
    <key>PathState</key>
    <dict>
        <key>/Volumes/ExternalHDDName</key>    <!-- ExternalHDDNameを書き換える -->
        <true />
    </dict>
</dict>

2015年7月15日水曜日

さよならFlashコンテンツ

Adobe Flash playerの脆弱性が次々と見つかっているようだ。mixiのアカウントを持っていた頃、ゲームといえばFlashだった。2年程前に持っていたFaceBookアカウントでも同じだった。だからSafariにFlashのバグがあると噛み付いたりもした。
だが、ゲームを伴うSNSを止めてみるとFlashはパソコンの世界でも劇的に比重が下がっていることに気がついた。そこへ来ての相次ぐ脆弱性の発見である。そろそろFlashは終わりかなと思ってMacから削除してしまうことにした。

Flash Playerの削除方法自体はこのサイトにある通りで良い。
(補足:アンインストーラーをダウンロードしなくてもアプリケーション > ユーティリティにあるAdobe Flash player Install Managerを起動する方法でもFlash Playerを削除できる)

問題はXHTML1.0 StrictまたはXHTML1.1でホームページを記述していて、YouTubeの動画を埋め込んでいた場合である。
XHTML1.0 StrictまたはXHTML1.1では、YouTubeが埋め込み用コードとして提供する<iframe>要素が使えないため、<object>要素を使うのだが、ここに落とし穴がある。
<object>要素では、YouTube動画を埋め込む際type属性でtype="application/x-shockwave-flash"と記述するからだ。

Youtubeはとっくの昔にHTML5プレーヤーに置き換わっている。だからYouTube本家ページや埋め込み用コードを用いれば、Flash Playerを削除しても動画は再生できる。だが、XHTML1.0 StrictまたはXHTML1.1適合化のために<object>要素を使った場合、埋め込み動画は再生できなくなってしまう。

対策はXHTMLを使い続けるならばXHTML1.0 Transitionalに変更する、またはHTML5に移行することである。両者ともYouTubeが埋め込み用コードとして提供する<iframe>要素が許容されるからだ。ただし、適合させるには、以下のようにちょっとだけ修正が必要だ。

YouTubeが提供する埋め込みコード


XHTML1.0 Transitional向け埋め込みコード(allowfullscreenを取り除く)


HTML5向け埋め込みコード(frameborder="0"をstyle="border:0;"で置き換え)


参考:XHTML1.0 TransitionalまたはHTML5に適合させる方法の英語のネタ元

2015年7月13日月曜日

El Captain Public Beta

Yosemite Public Betaでひどい目にあったのにも懲りず、El Captain Public Betaをインストールした。しかもメインで使っているMacだ。
だって別のパーティションにインストールして時々立ち上げる程度で何のテストができるだろう? そう、筆者は勇敢なのだ。(笑)

ところでEl Captain Public Betaだが、クリーンインストールが良かろうと思って、ここにある手順でUSBメモリを作成したが、起動可能にならなかった。 Yosemite Public Betaでは同じ手順で作成できたのだが…。
まぁ筆者の場合、クリーンインストールと言っても、OSを新規インストールするだけで、アプリや書類は転送するから、どこまでクリーンかというと甚だ怪しい。原則としてソフトウェアはパッチ等で最新状態にできるはずなので、上書きでも良いかなと思っている。

雑談はここまでにして、筆者が使っているソフトウェアで課題、あるいは問題があったものを書いておく。

  • Apache (2.4.12)
    拡張子appが付くアプリケーションではないが、筆者はホームディレクトリにサイトフォルダを置いて使っている。
    Yosemiteでコメントアウトしたhttpd.confの一部がコメントされ、サイトフォルダが使えなくなっている(404 Not foundになる)ので、以下のようにコメントアウトする。

    変更前

    #LoadModule userdir_module libexec/apache2/mod_userdir.so
    #Include /private/etc/apache2/extra/httpd-userdir.conf
    

    変更後

    LoadModule userdir_module libexec/apache2/mod_userdir.so
    Include /private/etc/apache2/extra/httpd-userdir.conf
    
  • Audio Hijack (3.1.1)
    Instant Onの互換性がなく、システムオーディオを操作できない。
  • Bartender (1.2.41)
    OS標準メニュー項目を収納できない。(作者既に知っている)
  • CotEditor (2.1.4)
    行番号を表示させていると、スクロール後、スクロール前の行番号とダブって見にくくなる。エディタとしては、ちょっと困るかも。(作者報告済み)
  • Epson Printer Utility 4 (9.42)
    インク交換時、画像のようにウインドウが乱れる。(本来表示されるべきでないヘッドクリーニングとギャップ調整ボタンが乱れて表示される)
    インク交換時のEpson Printer Utility 4ウインドウの乱れ
  • Genymotion (2.5)
    El CapitanをYosemiteの上書きでインストールした場合、kextが削除されているのでVirtualBoxを再インストールする必要がある。
  • Gomoku - Online Game Hall (1.2.0)
    起動しようとするとクラッシュする。
  • Google Chrome (43.0.2357.132)
    一度だけフォームで日本語が入力できなかったが、Google Chromeの再起動と、変換学習のリセットで治った。
  • Kindle for Mac
    購入したKindle本のうち一冊(筆者の場合最後に購入したもの)しか表示されない。El Capitanでの起動時に互換性がないと表示された。
    互換性がなかったのは、Ver.1.11.2。現在のVer.1.12.0では問題はない。
  • mi (3.0 Beta 10)
    HTMLの編集でタグ内に文字入力しようとすると、カーソルポインタがタグの直前に入る。スクロールキーで正しい位置にポインタを移動する必要がある。(作者報告済み)
    3.0b11a2にて改善済み。
  • Paragon NTFS for Mac OS X
    動作しない。
  • SATSMARTDriver (0.8)
    動作しない。SATSMARTDriver.kextのコード署名が不正だとされて読み込まれない。Yosemiteで動いていたバージョン0.8もダメ。
  • Soundflower (1.6.6b)
    動作しない。インストールはできるが、本体であるSoundflower.kextのコード署名が不正だとされて読み込まれない。
  • Xcode (7.0 Beta 3)
    起動するまでが大変。
    GateKeeper(セキュリティとプライバシー環境設定)を動作させていると、開く前の検証中にXcodeの応答がなくなる。
    GateKeeperの検証を途中で止めたら、起動しようとするとコンピュータが破損すると表示されるようになった。セーフブートでXcodeを起動したら、長い時間はかかったが、何とか立ち上がった。

El Capitan Public Betaの印象は、リリース前のYosemite Public Betaに比べたら月とスッポンである。何しろアプリケーションの互換性チェックをする余裕があるくらいだ。(笑)フィードバック項目も2015.07.13時点で10件、内容もいかにもベータテストらしいレベルである。

2015.07.15 追記
El Capitan Public BetaのDIskUtilityには光ディスク作成(Disk Burn)機能がない。ネットには超好意的にまだ搭載されていないだけとの意見が多いが筆者はそうは思わない。Public Betaで搭載されていないということは、Macのハードウェアラインナップから考えると削除されたと判断すべきである。光ディスクを作成するユーザーは進歩的なAppleの考え方によって切り捨てられたに違いない。
見た目も速度も大して変わらないEl Capitanは、筆者にとってこの一点で失格となりアンインストールされた。

2015年7月6日月曜日

キーチェーンアクセスの脆弱性(XARA)

MacではGoogle Chromeで入力したパスワードを保存すると、Google Chromeの設定ファイルではなく、キーチェーンアクセスに保存される。Google Chromeでパスワードを表示するためには、キーチェーンアクセスのパスワード、つまりユーザーアカウントのパスワードが必要になる。
一方Windowsではどうなっているかと言うと、8.1ではGoogle Chromeで保存したパスワードを表示するためにはユーザーアカウントのパスワードが必要だが、XPでは認証なしで見えてしまう。
だから、WinXPでもGoogle Chromeを使う場合、折角Mac側でキーチェーンアクセスに保存したパスワードが丸見えになってしまうので、Googleアカウントでパスワードを同期しないほうが良いと思うという趣旨の記事を書こうとしていた…。

ところがだ…。

パスワードについて調べているときに、信頼の拠り所だったキーチェーンアクセスに脆弱性があるという記事を見つけた。(英語の記事はこちら
問題の根は深いようで、Apple側の要請で公開を6ヶ月待って欲しいと言われたものの、期限を過ぎてもAppleが無回答(!)だったために公開されたらしい。(英語版より)
この研究でGoogle Chromeのパスワードが全て読み出せた(英語版より)とあるが、Mac版Google Chromeのパスワード管理の仕組みからも納得できる。

さらに恐ろしいのは、Mac App Store(iOSはApp Store)の審査を、この脆弱性を利用してパスワードを盗むアプリが通過できたことである。

まさにどうなっちゃてるの? Apple!?という気分である。Apple Musicなどに浮かれている場合ではない!

AppleもWindows同様に脆弱性があるようになったのだろうか? しかし、Windowsは月1回脆弱性を修正するアップデートを配布している。それに対してAppleは放置である。なかなか素晴らしい顧客を舐めきった態度ではあるまいか?

どうやら真剣にMacからWindowsへ移行する準備をする時期が来たのかも知れない。あるいは、もう少し様子見をするならばキーチェーンアクセスにパスワードを保存しないようにするなどの対策が必要なように思う。

最後に、例によってフィードバック窓口へのリンクを書いておく。より多くのユーザーが改善を要望すれば、Appleが問題を改善する気になる可能性もゼロではないと(半信半疑だが)信じている。

2015年7月5日日曜日

Wake On Demandの落とし穴(?)

今更ながらだが、Mac OS X Snow Leopard(10.6.x)以降、MacにはWake On Demandという機能が備わっている。
これは、LAN内にあるMacは、スリープ中でもFinderのサイドバーの共有項目に表示され、それをクリックするだけでスリープを解除、中身にアクセスできるという優れものだが、一つ落とし穴(?)がある。
それは、Macの他にAirMac ベースステーションなどのApple製Wi-Fiルーターをセットで使う必要があるということだ。先の記事を注意深く読むと、Bonjour Sleep Proxy という分かりにくい用語で説明されていることに気付く人もいるかも知れない。

筆者はこのことに気づかず、他社製Wi-Fiルータを購入してしまった。Macは2台持っているが、同じ部屋に置いてあるのでWake On Demandの必要性はない。(と、意地を張ってみるが、実はこのエントリを書くまでWake On Demandを知らなかった)

AirMac ベースステーションがなければ、Appleの言う所のWake On Demandは不可能だ。だが、似たようなことは可能だ。それはWake On Lanである。(参考までにWake On Demandという用語はApple語で、一般的にはWake On Lanと言う)
Wake On LanとはLAN内に接続された機器に対してマジックパケットという信号を送って機器を起動(Macはできない)したりスリープ解除することを言う。(詳しい情報

以下では、擬似的なWake On Demand(Wake On Lan)を実現する方法を説明する。

  1. wolコマンド

    wolコマンド(マジックパケットを発行するコマンド)はソースコード付きでこちらから入手できる。

    圧縮ファイルを解凍し、中のwolというファイルをインストールする。(ターミナルで以下のコマンドを実行する)

    sudo cp wol /usr/local/bin
    
  2. AppleScript

    AppleScriptを用意しなくてもwolコマンドを直接起動すれば目的は果たせる。AppleScriptは筆者のようなモノグサ人間向けである。

    --接続するMACアドレスの設定
    set myMACAddr to "00:11:22:33:44:55" -- スリープ解除するMacのAirMacカードのMACアドレス
    
    --エラーフラグの初期化
    set errFlag to false
    
    --Wake On Lanコマンドの存在チェック
    try
        do shell script "test -f usr/local/bin/wol"
    on error
        
        say "WOLコマンドがありません"
        set errFlag to true
        
    end try
    
    if not errFlag then
        do shell script "usr/local/bin/wol " & myMACAddr
    end if
    

    スリープ解除するMacのAirMacカードのMACアドレスは、Appleメニュー > このMacについて > システムレポート... > Wi-Fi > インターフェイス:で調べることができる。

    このAppleScriptを実行すればMACアドレスを登録したMacのスリープ解除ができる。スクリプトメニューに登録して使うとさらに便利かも知れない。

なお、このWake On Lanは、Wake On Demand同様、省エネルギー環境設定パネルでWi-FI ネットワークアクセスによるスリープ解除がチェックされている必要がある。(デフォルトではチェックされている)

Wi-Fi アクセスによるスリープ解除受け入れ
Wi-Fi アクセスによるスリープ解除受け入れ

Wi-FI ネットワークアクセスによるスリープ解除はWake On Demandと連動しており、2時間に1回程度の間隔でMacのスリープが解除される。この時Macは自分がWake On Demandに対応できるよという信号を送った後、再びスリープする。
Wake On Demandを含めて、いわゆるオンデマンドな利便性を求める場合、定期的なMacの目覚めというゾンビ現象(?)がセットになっていることは覚えておく必要がある。