So-net無料ブログ作成

LinuxカーネルのBUG_ONとか [Linux]

たまにドライバ書いたりすると忘れるのでメモ

・ポインタがNULLであることは想定上はありえない(はず)
・が、開発版や、開発していて仕様が変わるともしかしたらNULLが入ってしまうかもしれない

なんてときにWARN_ON/BUG_ONを使うとよい

WARN_ONやBUG_ONはconditionをひとつとって真のときにクラッシュログを出してくれる
コールスタックとソースコードの位置が出てくるので開発に便利。
WARN_ONの場合はカーネルが停止しないので警告を出してくれるだけなのでこっちのほうが使いやすいかもしれない。

前もって条件分岐されている場合は、WARNやBUGを使う。

上記は、実際に動作させた場合だが、staticに判定出来る場合はBUILD_BUG_ONを使う。

実装は sizeof(char[1 - 2 * !!(condition)]) というマクロらしい

conditionが1のときに、負の配列のサイズを取得しようとするのでコンパイル時にエラーになる。
これは目鱗だった。

ある配列のサイズが別の変数の大きさよりかならず大きい必要があるとか、そういう場合に一行書いておくと、将来的に拡張された場合などにビルドエラーになって検知できる。

Raspberry Pi + Kinect は失敗 [Linux]

むきー

GUIセットアップしてやるべきだったかどうかは不明だが今のところうまくいっていない

http://jonmacey.blogspot.jp/2012/07/raspberry-pi-and-kinect.html

ここを参考にKinectを動かそうと試みる

libusbは入れたほうがよい。標準パッケージだと関数が足りていない模様。
あと他にもいくつかパッケージを入れる必要があるのと、ldconfigで/usr/local/libあたりにパスを通す必要がある(コメントにもあるが)
それを行うと上記のページにあるtiltdemoは動く

ただ、これってKinectを文字通り動かすだけでセンサー的なものは何一つ動いていない

上記のページではサンプルをビルドしていないので、サンプルをビルドしてみる
サンプルをビルドするためにはOpenGLあたりのライブラリを複数インストールする必要がある

ひとまず入れたパッケージリスト

~# history | grep "apt-get install" | awk ' { print $4 }'
vim-scripts
libusb-dev
git-core
cmake
libgl1-mesa-dev
libglui-dev
libxmu-dev
libxcb-glx0
libva-glx1
libgl1-mesa-glx
mesa-utils


またX windowも動かす必要があるのだが、USBが2ポートしか無いのでマウスがさせないという事案が発生w
ターミナルだけ立ち上げるためにマウスを挿してからキーボードに挿し替える

で、glviewとかやってみても動かない

glxinfoなるものをやってみたところ
"Error: couldn't find RGB GLX visual or fbconfig" というのがでていた

多分ここで議論されているのだと思うが、結果的にどうなったのかよくわからない

http://www.raspberrypi.org/phpBB3/viewtopic.php?f=66&t=11620

ひとまずここで挫折。

結果
 首振りしてLED点滅させるだけ可能

Raspberry Pi セットアップ [Linux]

Amazonで以下を購入

・SDカード16GB
・USB micro B端子
・必要ならHDMIケーブル

自分はサーバ的使い方しか考慮していないのでなにか動かすにしてもSSHでやる予定
だからデスクトップ環境は基本的に使わない
ただ初回起動には使うので必要なら買っておくこと
自分はPS3で使っているケーブルで代用した

あと、700mA供給できるUSBポート
自分は外部電源のUSBハブで代用した
ここは素直にACアダプタにしてほしかったところでもある
追記:iPhone 3Gの使ってないUSBアダプタ用電源を発見したのでそれを使った。便利。

Oracle Virtual Boxをインストールし、Debianをインストールする。
netinstでデスクトップ環境を外してインストール時にSSHサーバを選んでおく
必要な物だけaptするのが好き

USBカードリーダーにSDをさしたあと、VirtualBoxのUSBデバイスに選択する
その後抜き差しするとLinux側で認識できる
多分 /dev/sdbになっている

Raspberry Piの公式サイトからSD用のイメージを取得する
Zipになっていて展開すると1G以上になる。

http://www.raspberrypi.org/downloads

wgetでzipを取得後 unzipするのがよさげ

WindowsでDLしてしまった場合はWinScpでコピーする
/etc/init/sshd_configあたりでパスワード認証をYesにしておく

ネットワークをホストオンリーアダプターにする
ifdown eth0 ; ifup eth0
で192.168.56.xxxなIPが手に入る

ls /dev/sdb* などとしてUSBデバイスが認識できていることを確認
間違ってると死ぬので気をつけること
念のためsdb1があればマウントしてみるのもよい
mount /dev/sdb1 /mnt
ls -la /mnt
umount /mnt
何かファイルがあったらやめておく

成功したら
dd if=2012-09-18-wheezy-raspbian.img of=/dev/sdb bs=1M
などとして暫く待つ
VirtualBox経由だとさすがに遅い気がするのでWindowsからのほうがいいかもしれない。

終わったらUSBのアイコンからGenricDeviceをクリックして取り外す

そのSDをさして、HDMIとLAN、USBキーボードを差す

002s.jpg

電源が入るとLEDが光るのでわかりやすい。
安いのにいいデバイス。あと透明のケース買っておいてよかったw

あとは勝手にGUIが立ち上がって設定項目がいくつか出てくるので
SSHを有効にしたりパッケージのアップデートしたりするぐらい
念のためパスワードは再設定しておいたほうがいいぐらいか

Finishを選ぶと終了してpiという名前のユーザでログインしているので
sudo suなどとしてrootになり、/etc/ssh/sshd_configを編集する
passwd root などとしてルートで入れるようにする

ifconfigでIPを確認してWindowsからPuttyなどでログインできればセットアップ完了

あとはLANと電源があればいろいろいじれるようになる。

ファイル転送はWinScpでOK

root@raspberrypi:~# uname -a
Linux raspberrypi 3.2.27+ #160 PREEMPT Mon Sep 17 23:18:42 BST 2012 armv6l GNU/Linux

比較的カーネルは新しい模様
さて何するか・・・


Amazonベーシック SDHCカード 16GB class10

Amazonベーシック SDHCカード 16GB class10

  • 出版社/メーカー: AmazonBasics
  • メディア: Personal Computers



Amazonベーシック USB 2.0 (A) オス - Micro B ケーブル (1.8m)

Amazonベーシック USB 2.0 (A) オス - Micro B ケーブル (1.8m)

  • 出版社/メーカー: AmazonBasics
  • メディア: Personal Computers



Raspberry Pi到着 [Linux]

発送されたとメールが来てたがすっかり忘れていた。必要な物も用意しておらず完全に泥縄。

・ケースとボードだけ購入

・電源はUSB micro B端子なのでAmazonで購入
・メインストレージはSDカードなので同様にAmazonで購入

・シリアル出力
 Windowsでコピペしたり、SSDで接続するのがめんどくさいのでシリアル接続をしようと思ったが、そんな端子は無かった。どうもGPIO端子群の中から取り出さないといけないらしい。

 http://elinux.org/RPi_Serial_Connection

 RPi側は3.3Vだが、シリアルは古いので5Vでコンバーター的なものが必要なようだ。電圧変換だけすればつながるような記事も見かけるし、3.3V駆動のシリアルチップを使っているのもある。正直良くわからん。

今後の予定

・OSの準備
 SDへの書き込み
 最初からイメージを用意してくれている

・何ができるか
 HDMI出力、ビデオ出力、オーディオ出力、LAN、USB*2とPC Linux的なことはできる。

・注意点
 電源が弱い
 USB供給は500mAだが、このボードのやつは100mAらしい。そもそもPCのUSB端子は500mAを瞬間的に超えることが多く、超絶保護されているので繋ぐ場合は電源は別に取る必要があるだろう。

 例えばNAS的な使い方をしたい場合にUSB端子に2.5inch HDDを繋げばいいじゃないかと思うが、ソフトウェア的な部分は問題ないがハードウェアの電源でひっかかる。外部電源必要だとケーブルが増えてCoolではない。

 何やるかは動いてから考える。

Linuxシリアル関係 [Linux]

最近は絶滅しつつあるシリアル設定もいざというときにできないと困るのでまとめておく

・Linuxでシリアルログオン
 「console=ttySx,115200,8n1r」をカーネルオプションに追加

・色が出ない
 TERM=Linux

・Puttyでサイズが小さすぎる
resizeコマンドのあとscreenでOK

・UbuntuでGUIを起動させたくない
 「text」をカーネルオプションに追加
 そもそもサーバー版いれろという話はある

・Ubuntuでシリアルログインできない
 /etcのどっかにttySx.confがあればよいらしい

思ったより数がなかった。
なんでUbuntuかというとArm版は大抵Ubuntuになってることが多いから。

あとはクロスコンパイルとかできればばっちり。
debootstrapのクロス版があったような。multistrapか。
コンパイラはバイナリを落としてきても良いが、そもそも素のやつも作ってくれるのがあった気がするんだがど忘れ。

SELinuxでロールを作る(一部解決編) [Linux]

http://d.hatena.ne.jp/kaigai/20100424

SELinuxでロールを作るのがどうも意味がよくわからなかったが、やっとある程度見えてきた。自分の理解不足+元々のポリシーの不備?など理由はいろいろあった。


1.ロールを作るのは型やドメインを作るのと同じでrole xxx_rで終わり。
2.しかし、そのロールがどのUNIX/SELINUXユーザに属しているかは、インストール用ポリシーをつくるのでなければ、semanageで行う。さらに、semanageで行う際に既存ユーザに「追加」はできないので「-l」でユーザーを確認するのがよい。というか、組み込み型を壊すと面倒なので素直に新しいSELINUXユーザを作ってしまうのがよい。ポリシーファイルだけで行うのはインストール用のビルドパッケージを作るときだけでいいようだ。
3.前後したがUNIXユーザに1つのSELINUXユーザがあり、そのSELINUXユーザが取りうるロールが複数存在する。
4.特定のロールになったときにどのドメインになっているかは、default_contextで決められる
5.refpolicyのstaff_rには不具合があり、そのままだと/homeの下にアクセスできない。これはstaff_rが/rootにアクセスするアクセス権しかもっていない。しかし昨今のLinuxセキュリティではルートアカウントを使わないようにして、スーパーユーザが管理するようになっているので、refpolicyは問題あるのではないか。もしかしたらsesetboolで設定できるかもしれない。
6.sudoが動かない。Debianの場合はsudoがSELinuxに対応していないので、ソースをもってきて、./configure --with-selinuxしてビルドする必要がある。Permissiveでは、sudoで動かせるが、Enforceにすると動かせない。この問題の詳細は未調査。


sudoがまだ使えてないので、魅力は半減だが、SELINUXユーザとロールのペアが簡単に作れることがわかったので、そこからallowでルール追加してくことである程度思い通りになるようになった。

SELinuxのexampleはexampleではない [Linux]

最近SELinuxを調査しているのだが、どうにも腑に落ちないことが多い。

例えばExampleがdocフォルダの中にあり、しかもろくに説明がない。

しかしMakefile.exampleをMakefileに変更してみると簡単にビルドが通る。
exampleはmyapp用のルールなので、試しにmyappを/usr/local/binに突っ込んで
example.fc修正して、restoreconしてsetenforce 1して実行してみると
見事に「許可がありません」と出る。

そもそもexampleが/usr/sbin/myappってなんでそんなところをターゲットにしているのか

じゃあ、他のアプリはどうなってるんだとソースを眺めてみる。

一番宣言が少なそうなwm.teを見てみると、実行型しか定義していない。
これでいいんだろうか。

2番目に小さいuserhelper.teを見てみると、なんかサポート型みたいになっている。
別の所で使っているのだろうか。

3番目に小さいada.teを見てみるとこれは割とまともだった。
型を定義して、実行型とドメインがある。その二つを結びつけるのにapplication_domainを呼び出し、さらにそのドメインとロールを結びつけている。

type ada_t;
type ada_exec_t;
application_domain(ada_t, ada_exec_t)
role system_r types ada_t;

その後、ドメインにアクセス権を付与している。

allow ada_t self:process { execstack execmem };

userdom_use_user_terminals(myapp_t)

optional_policy(`
unconfined_domain(ada_t)
')

1個目はよくわからない。自身に実行メモリを許す?

2個目はターミナルに出力するのに便利なマクロだろう。多分。
注意書きを読んでみたら、Terminalでインタラクティブな受け答えをするならいれろとある。しかし、これはセキュリティホールにもなるのでそういうのが必要ないならいれるなとあった。

3番目はドメイン自体をunconfined_tと同じようなゆるい一般ユーザレベルのアクセス権を与えるものだと思う。
と、思ったらまったく逆で、完全に信頼のおけるドメインだけに付与しろとある。

とりあえずハローワールドを/usr/local/bin/におき、exampleをadaの上の部分だけにして、ロールは自分自身がstaff_rなのでstaff_rに付与させた。この状態でmake reload して、setenforce 1してmyappを実行する。

やっと動いた。多分ドメイン遷移してちゃんと動くアプリはこういうものなんだろう。しかしサンプルのひどさはどうにかならないものだろうか。

あとSELinuxはC言語でいえばマクロだけでプログラムやるようなもので、マクロがマクロを読んでいて、欲しいマクロがどこにあるのかわからないし、そのマクロで本当にいいのかもわからない。
ベーシックな関数のリストとかそういうのが見当たらない。探し方がわるいだけだろうか。

make install-docsやってみたら /usr/share/doc/refpolicy-xxx/htmlにHTMLが大量に作成された。が、今はLinuxとWindowsのやり取りできるプロトコルがSSHのみなので途方に暮れる。

DebianでSELinux (新しいロールの作成) [Linux]

先日のエントリで、やっぱり意味がわからなかったので、素直にrefpolicyからビルドしてみることにした。

staffからmyroleを作ってみることにする。

staff自体の定義は policy/modules/roles/staff.xxになっている。

te : タイプ(型定義)
fc : ファイルコンテキスト
if : インターフェイス(外部参照定義)

これはどのモジュールでも一緒だが、ロールにおいてはfcは存在せず、ifも大したことがない。
teも先日のrefpolicyのページ(http://www.selinuxproject.org/page/RefpolicyBasicRoleCreation)に書いてあるとおり、ロールそのものの定義と、templateを使った宣言がかかれている。あとは他のアプリケーションなどへのアクセス権の設定のみである。

role myrole_r;

userdom_unpriv_user_template(myrole)

staffからコピーしてmyrole_rを定義して、policy/modules.confにmyroleを追加。
その後、 make; make install; make loadしてみると、デフォルトタイプが無いと言われる。

で、上記のページによると、デフォルトタイプとデフォルトコンテキストを定義しろとある。

それらのファイルがどこにあるかというと

config/appconfig-mls/default_contexts
config/appconfig-mls/default_type

にあって、HPにあるように追加すると、

# newrole -r myrole_r
root:myrole_r:myrole_t:s0-s15:c0.c1023 は有効なコンテキストではありません

お、あと少しな感じ。つまりrootユーザーに大してmyrole_rがペアになっていないという意味だろう。
そこで、それらしいのを探してみると、

policy/users に

gen_user(root, sysadm, sysadm_r staff_r ifdef(`enable_mls',`secadm_r auditadm_r') system_r, s0, s0 - mls_systemhigh, mcs_allcats)

と、書かれている。usersのファイルを見てみると、ユーザーとそれに属することができるロールを書いておくものらしい。staff_rの横にmyrole_rを追加する。

・・・


# newrole -r myrole_r
パスワード:
# id -Z
root:myrole_r:myrole_t:s0-s15:c0.c1023

と、無事ロールを作ることができた。最初のモジュール作るところだけだと問題ないが、最後のgen_userのところを考えると、ソースからビルドしないと新規ユーザーは追加できないようだ。

あとrefpolicyでビルドするときにbuild.confをいじったらmake install-headersは必ずやる必要がある。別モジュールをビルドするときにも文句を言われる。

今のところロールを作れたからなんだというわけでもないが、作ることでSELinuxの理解にもつながる。

完成した今にしてみると・・・

・rootと結びつくロールは何か users
・ロールはどのドメインに属しているか default_type

デフォルトコンテキストがまったく役に立っていないことがわかる
というものsshでのログイン直後はremoteログイン扱いでstaff_rになっているので、myroleがいきなり使われることはない。

そう考えると、ここからの発展型としては別のユーザーのデフォルトロールをmyroleにすることなんだろうが、それが案外難しい。

まずrootアカウントは当然のごとく1つしかないので、ログイン直後はsysadm_rなりstaff_rになってしまう。これを変更するなら素直にstaff_rを変更すればいい。(どうせソースからビルドしているんだし)

通常のユーザーはuser_u:user_rとなっているが、そもそも一般ユーザーはルートよりも権限が無いので、余程の特殊なことがしたいわけでもない限りは特別にロールを作る必要はない。

あと、ロールを作ってはみたもののパスワードは必ずルートのパスワードを入力させられるので、これもセキュリティになっているのか激しく謎である。ルートとしてログインしている以上、簡単にsysadm_rにはなることができるので、新しいロールを作る必要も無いし、リモートだからと最初がstaff_rにさせられている理由もわからない。

イマイチここらへんのSELinuxとしての考え方、思想がわからない。ロールに関しては作れるけどあまり意味はないということだろうか。

というわけで、次はMLSのエラーを消すことを目標にしてみる。

DebianでSELinux [Linux]

うまく行かなくて投げ出していたが、割りと上手く動きそうなのでまとめ

・selinuxのパッケージとかポリシーはaptで探せばいいので割愛
・/etc/selinux/configでMLSかdefaultかを選ぶ(インストールしたパッケージよる)

refpolicyを使う

・gitのものはルールにエラーがあってコンパイルできなかったのでパス
・refpolicyは以下のページから落とす
 http://oss.tresys.com/projects/refpolicy
・tarで解答した後 INSTALLの途中から従ってやる
 tar xjf ~~
 cd refpolicy
 make install-src これが必要かは謎
 cd /etc/selinux/refpolicy/src/policy
 vi build.conf
 make
 make install
 make load

 build.confいじったあと、makeするが、ここでmake loadを行い、/etc/selinux/policy/policy.24ができあがることを確認する。ここまでいかないと動作しない
・vi /etc/selinux/configでrefpolicyで起動するようにする
 touch /.autorelabelでラベリングまでできれば問題ない

・DracutでSELINUX有効にしておくとよい。

・カスタムポリシーの作成
 相変わらずデフォルト状態だとエラーが出ているのでカスタムポリシーを作成する

・refpolicyの場合 make install-headersをやる必要がある
・policy/docにMakefile.exampleがあるので、それをMakefileにしてmakeする。それがうまく動けば問題ない。

・audit2allowでteファイルを作成する
 audit2allow -d -m mlsfix > mlsfix.te
 make reload
・でmlsfixという名前のモジュールが入ってくれる

というわけで、簡単だがrefpolicyのインストールができるようになったので、カスタマイズはここからいろいろできると思う。

Linux Security [Linux]

最近LinuxのSecurityについて調べてみたが、不景気なのかあまりいい本がない。

今時のネットワークから攻撃を受ける場合は素直に個別コンポーネントのネットワーク設定に依存するが、すべてのアクセスを洗い出してそのリクエストが良いのか悪いのかを確認する必要がある。

そういう部分とは別にLinux関係のセキュリティを調べてみた。


Hardening Linux

Hardening Linux

  • 作者: James Turnbull
  • 出版社/メーカー: Springer Verlag Gmbh
  • 発売日: 2008/09
  • メディア: Perfect



セキュリティ全般についてまとまっていて、最低限これはやっておかないとまずいよねという内容。自動でやってくれるパッケージとかもあるようで、それの紹介もしている。


Fedora 12 Security-Enhanced Linux User Guide

Fedora 12 Security-Enhanced Linux User Guide

  • 作者: Fedora Documentation Project
  • 出版社/メーカー: Fultus Corporation
  • 発売日: 2009/12
  • メディア: ペーパーバック



SELinuxについて調べようと思ったらこの本が安かった。概念的な説明と本当に簡単な設定方法しか書いてないが、無いよりましというか。そもそもSELinux自体まともに取り扱おうとしているのは商用Linuxで商売しているRedhatとその無償版であるFedoraぐらいのもののようだ。Debianで試しに動かしてみたら初期パッケージですらエラーがでまくるという悲しさ。

Linuxというと、自宅で使う場合はめんどくさいから全部Rootでいいや みたいな考えがあるので、イマイチセキュリティ的な概念が無い。うぶんつなんかはルートでのログインをデフォルトで禁止していて、必要なときはsudoでやらせるのがポリシーになっているし、DebianもGUI使う場合はそうなってた気がする。

どういうふうにするのが基本なのかがイマイチよくわかっていないので、本でベーシックな部分を身につけようと思ったが、上記の2冊は個別の案件については述べているが・・・

Linuxの場合ユーザーを作ってユーザーとグループだけがアクセス出来る権限にして運用するのが普通なのだろう。多分。アパッチとかもユーザーが自動的に作られた気がするが、しかしそれはRoot権限をもっていたりするのだろうか。そういうところの基本的な考え方が知りたい。