2017年2月21日火曜日

NFSv4+FreeIPAでホームディレクトリの共有

概要

  • NFSv4+FreeIPA(Kerberos認証)でホームディレクトリの共有
  • FreeIPAの自動マウント機能を利用

バージョン

  • CentOS 7
  • FreeIPA 4.4

構成

  • FreeIPAサーバ
    • ドメイン名:ipa.hirune.example
  • NFSサーバ
    • ドメイン名:server.hirune.example
    • ホームディレクトリ:/export/home
  • NFSクライアント
    • ドメイン名:client.hirune.example

手順

FreeIPAサーバの設定

  1. サービスの追加
    # ipa service-add nfs/server.hirune.example
  2. 自動マウントの設定
    # ipa automountkey-add default --key /export --info "-fstype=nfs,sec=krb5,soft,intr server.hirune.example:/export" auto.direct

NFSサーバの設定

  1. NFSのインストール
    # yum -y install nfs-utils
  2. IDマッピングの設定
    • /etc/idmapd.confを編集
    • [General]下にDomain = hirune.exampleを追加
  3. ファイアーウォールの設定
    # firewall-cmd --add-service=nfs --permanent
    # firewall-cmd --reload
  4. keytabの取得
    # ipa-getkeytab -s ipa.hirune.example -p nfs/server.hirune.example -k /etc/krb5.keytab
  5. サービスの起動
    # systemctl start nfs-server
    # systemctl start nfs-secure-server
  6. ホームディレクトリの作成
    # mkdir -p /export/home
  7. SELinuxを有効にしている場合は、ホームディレクトリのコンテキストを変更
    # semanage fcontext -a -e /home /export/home
    # restorecon -R /export/home
  8. 共有ディレクトリの追加
    # echo "/export/home gss/krb5(rw,async,root_squash,no_subtree_check,sec=krb5)" >> /etc/exports
  9. 共有の有効化
    # exportfs -ra

NFSクライアントの設定

  1. NFSのインストール
    # yum -y install nfs-utils
  2. 共有ディレクトリの作成
    # mkdir /export
  3. 自動マウントの設定
    # ipa-client-automount --unattended
  4. nsswitch.confの更新
    # authconfig --updateall

参考

2017年2月20日月曜日

OpenLDAPでメタディレクトリを利用した複数のデータベースの統合管理

やりたいこと


  • 2つのLDAPデータベースを統合してクライアントに表示させたい
    • メタディレクトリとよばれる機能を用いる

環境

  • CentOS 7
  • OpenLDAP 2.4
    • データベースA
      • ルートDN:ou=dba,dc=hirune,dc=example
    • データベースB
      • ルートDN:ou=dbb,dc=hirune,dc=example
    • メタディレクトリ
      • ルートDN:ou=meta,dc=hirune,dc=example

概要

  • メタディレクトリにアクセスしたら、データベースAの内容とデータベースBの内容が両方表示されるようにしたい
  • メタディレクトリを使うにはcn=configを編集してモジュールを追加でロードする必要がある
    • /usr/lib64/openldap/back_ldap.so
    • /usr/lib64/openldap/back_meta.so
  • objectClassにolcDatabaseConfig・olcMetaConfigを持たせたものをcn=configに追加すればメタディレクトリになる

2017年2月15日水曜日

WORKGROUP環境のWindowsからFreeIPA認証(Kerberos認証)で接続可能なSambaファイルサーバの構築

やりたいこと

  • FreeIPAでSambaファイルサーバの認証
  • WORKGROUP環境のPCからSambaファイルサーバに接続

環境

  • FreeIPAサーバ(ipa.hirune.example)
    • CentOS 7
    • FreeIPA 4.4
  • Sambaファイルサーバ(samba.hirune.example)
    • CentOS 7
    • Samba 4.4.4
      • 標準リポジトリからのインストールのためAD DC (Active Directory Domain Controller)機能はなし
  • Windows 10 Home・Pro
    • Sambaファイルサーバのクライアント
    • Active Directory不参加(WORKGROUP環境)

概要

2016年1月30日土曜日

Raspberry Pi 2 Model Bと一緒に買ったもの

背景

Raspberry Pi 2 Model Bを買いました.
Raspberry PiはSDカードや電源アダプタの仕様・相性が悪いと動作しないことがあります.
そのため,私がRaspberry Piの購入のときに気をつけたことについて書き残そうと思います.

最低限必要なもの

  • Raspberry Pi 2 Model B本体と専用ケース
    • ケースは自作でもいいです(が,私には無理です)
    • デスフラッシュ問題を防ぐため,無色透明なケースは避けました
  • microSD
    Transcend microSD 16GB UHS-I対応 TS16GUSDHC10U1
    • Raspberry Piの購入にあたって一番重要なのがmicroSD
      • 激しいアクセスがあるため(?)一番壊れやすい
      • 相性があるらしく,下手すると起動さえできない
    • 条件
      • 無期限保証であること
      • MLCチップを採用していること(おそらく故障率が低くなる)
      • レビューでRaspberry Piでの動作報告があること
    • ちなみにRaspberry PiはUHS-Iに対応していない(検証記事)ので無理にUHS-Iにする必要はない
    • でもTranscendはあまりRaspberry Pi向けではないらしいので,SanDisk製の方が安心だと思います
  • 電源アダプタ
    Anker 24W 2ポート USB急速充電器 A2021111
  • USBケーブル
    Anker PowerLine Micro USB ケーブル
    • 給電用
    • 2.4Aまで対応しているものがいいです
    • 同じ急速充電対応でも2.0Aまでのものが紛れ込んでいる可能性あり?
    • 今回選んだケーブルに関しては「どのUSB充電器に対しても、最適な充電スピードが可能」との説明があったため購入.実際に2.4Aまでいけるかは未確認.

その他のオプション

Raspberry Piの初期設定に,ネットワークかディスプレイのどちらかが必要になるので,どちらかを選んで必要なもの買えばいいと思います.
もちろん両方買うのもあり.

私はほとんどAmazonかヨドバシで買いましたが,たぶんもっと安く買えるところがあると思います(電子部品系の通販サイトなど).

2015年11月17日火曜日

smaliの文法まとめ

Androidのapkをapktoolを用いて逆コンパイルするとsmaliファイルが出てきます.
先日,そのsmaliファイルを読む機会があったので,そのときに学んだsmaliの文法をまとめておきます.

注意

  • 説明の簡略化のために,メソッドとフィールドの説明におけるJavaのコードにおいて,文法を守っていない部分があります
  • レジスタの説明などにおいて,一部smaliとdex,Dalvik VMを同一視しています

Javaにおける型は,基本データ型,クラス型,配列型の3種類に分けられます.
それぞれの型について,smaliではどのように型を表記するかを示します.
  • 基本データ型smaliでは,基本データ型は大文字のアルファベット1文字で表します.

    smaliJava
    Vvoid
    Zboolean
    Bbyte
    Sshort
    Cchar
    Iint
    Llong
    Ffloat
    Ddouble

  • クラス型
    smaliでは,Javaと比較してクラス名の表記が以下の点で異なります.
    • クラス名の最初が"L"
    • パッケージ名の区切り文字が"."ではなく"/"
    • クラス名の最後が";"

     例
    smaliJava
    Ljava/lang/Object;java.lang.Object
    Ljava/lang/String;java.lang.String
    Lpackage/name/ObjectName;package.name.ObjectName
  • 配列型
    smaliでは,配列型は"["から始まる文字列で表します.

  • smaliJava
    [Iint[]
    [[Iint[][]
    [[[Iint[][][]
    [Ljava/lang/String;java.lang.String[]

メソッド

smaliでは,メソッドを以下のように表記します.
オブジェクト名->メソッド名(引数の型)戻り値の型

smali
Lpackage/name/ObjectName;->MethodName(III)Z
Java
boolean package.name.ObjectName.MethodName(int, int, int)

smali
Lpackage/name/ObjectName;->MethodName(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
Java
String package.name.ObjectName.MethodName(int, int[][], int, String, Object[])

フィールド(メンバ変数)

smaliでは,フィールドを以下のように表記します.
オブジェクト名->フィールド名:フィールドの型

smali
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
Java
String package.name.ObjectName.FieldName

レジスタ

smaliでは,レジスタとよばれる変数を介して,引数の受け渡しなどを行っています.

ビット数

レジスタの大きさは32ビットで,boolean,intなどのほとんどの型を1つのレジスタに格納することができます.
ただし,long型,double型のみは,格納に64ビット必要なため,レジスタが2つ必要になります.

種類と表記

レジスタは,ローカルレジスタ,引数レジスタの2種類に分けられます.

ローカルレジスタはsmali上でv0,v1,v2…と表記され,レジスタの最大数は.localsディレクティブなどによって変動します.
たとえば".locals 5"であれば,v0~v4のレジスタを使用することができます.

引数レジスタはsmali上でp0,p1,p2…と表記されます.
レジスタの最大数や値は,staticメソッドかどうかによって,少し挙動が変わってきます.
  • staticメソッドの場合
    • 引数レジスタの最大数は(引数の数)個になります.
      たとえば method(int, int, int, int) というメソッドであれば,引数の数は4個なので,p0~p3の4個のレジスタを使用することができます.
    • 引数レジスタは名前の通り,メソッドに渡された引数が格納されます.
      たとえば method(1, 3, 5, 7) のようにメソッドを呼び出した場合,引数レジスタに格納される値はp0 = 1, p1 = 3, p2 = 5, p3 = 7になります.
  • staticメソッドでない場合
    • 引数レジスタの最大数は(引数の数+1)個になります.
      たとえば method(int, int, int, int) というメソッドであれば,引数の数は4個なので,p0~p4の5個のレジスタを使用することができます.
    • 引数レジスタは名前の通り,メソッドに渡された引数が格納されます
      ただし,staticメソッドでない場合は,p0にthisへの参照が格納されます
      たとえば method(1, 3, 5, 7) のようにメソッドを呼び出した場合,引数レジスタに格納される値はp0 = this, p1 = 1, p2 = 3, p3 = 5, p4 = 7になります.
なお,long型,double型はレジスタが2つ必要になるので,引数の数とレジスタの最大数がずれることに注意してください.
たとえばstaticメソッド method(long) の場合,引数は1個ですが,long型の格納にレジスタが2個必要になるため,レジスタの最大数は2個となり,第一引数はp0とp1に格納されます.

smaliの読み方

smaliの各行は大きく「コメント」「ラベル」「ディレクティブ」「命令」に分かれます.

「コメント」は,コンパイル時に無視される部分です.
Javaでは"//"以降がコメントになります.
smaliでは"#"以降がコメントになります.

「ラベル」はジャンプ命令などで飛ばされる先になります.
":"から始まる行がラベル行です.
":label1"のようにしてラベルを定義します.

「ディレクティブ」と「命令」の違いは気にしなくてもいいと思います.
文法的には"."から始まるものが「ディレクティブ」,そうでないものが「命令」となります.
内部的には,定数情報の格納を行うのが「ディレクティブ」,情報の操作などを行うのが「命令」という感じがします(あんまりよくわかってない).

命令一覧に関しては,Dalvik opcodesをご覧ください.

ディレクティブ一覧


私が見たこと無いディレクティブはわからないので省略します….
ディレクティブ説明
.classクラス名の定義
.class public Lpackage/name/ObjectName;
.superスーパークラス
.super Ljava/lang/Object;
.implements実装インターフェース
.implements Ljava/io/Serializable;
.sourceJavaソースファイル名
.source "ObjectName.java"
.fieldフィールド定義
.field private FieldName:Ljava/lang/String;
.annotationアノテーション
.annotation runtime Lorg/junit/Test;
.end annotation
.methodメソッド定義
.method public static main([Ljava/lang/String;)V
    メソッドの中身

.end method
.localsローカルレジスタ数の設定
.locals 5 #ローカル変数の個数は5個
.array-data配列の初期値の定義
.array-data 4 #要素が4バイトの配列
    0x800000
    0x400000
    0x200000
    0x100000
.end array-data
#設定された値はfill-array-data命令で書き込みできる
.packed-switch連続した値におけるswitch文の遷移先設定
.packed-switch 10 #値10から遷移チェックを開始
    :label10 #値が10のときの遷移先ラベル
    :label11 #値が11のときの遷移先ラベル
    :label12 #値が12のときの遷移先ラベル
    :label13 #値が13のときの遷移先ラベル
.end packed-switch
#あくまで遷移先ラベルの設定のみで,実際の遷移は行われない

#実際の遷移はpacked-switch命令で行われる
.sparse-switch飛び飛びの値におけるswitch文の遷移先設定
.sparse-switch
    10 -> :label10 #値が10のときの遷移先ラベル
    20 -> :label20 #値が20のときの遷移先ラベル
    25 -> :label25 #値が25のときの遷移先ラベル
    51 -> :label51 #値が51のときの遷移先ラベル
.end sparse-switch
#あくまで遷移先ラベルの設定のみで,実際の遷移は行われない
#実際の遷移はsparse-switch命令で行われる
.lineJavaソースコードで何行目にあたるか(デバッグ用)
.line 10 #Javaソースコードでは10行目
.localローカル変数の個数
.line 10 #Javaソースコードでは10行目

2015年10月24日土曜日

HSPdecoを利用したHSPプログラム(Elona)の逆コンパイル

Elonaの解析を行うため、HSPdecoを用いて逆コンパイルを行いました。

必要なもの
HSPdeco 1.00 と 最新版のDictionary.csv (10/25更新)
またはHSPdecom 1.00(12/15の追記参照)
HSPdecomの場合は、最新版のDictionary.csvは不要です。

注意
HSPdecoに付属のDictionary.csvは古く、一部の命令を認識できないため、最新のElonaではエラーが出ます。
たとえば、Elona omake overhaul 2015/07/19の場合、start.hsp.logには以下のように出力されます。
000001行:deHSPの出力する#structはHSPの公開されている言語仕様には含まれません
127579行:式:不適切な要素を検出
265648行:式:不適切な要素を検出
270995行:式:不適切な要素を検出
271039行:式:不適切な要素を検出
271106行:式:不適切な要素を検出
272734行:式:不適切な要素を検出
そのため、Dictionary.csvを最新版に差し替えておく必要があります。
最新版へのリンクはすでに上に示しました。

手順
例としてomake_overhaul.exeを逆コンパイルします。

  1. HSPdeco.exeと同じフォルダにあるDictionary.csvを、最新版のDictionary.csvに置き換える
  2. HSPdecoを起動し「ここにドロップしてください」と書かれている部分に「omake_overhaul.exe」をドラッグ&ドロップすると解析が始まる
  3. 解析終了後「omake_overhaul.exe」が置いてあるフォルダに「omake_overhaul」という名前のフォルダが作られていることを確認する
  4. 「omake_overhaul」フォルダ内のstart.axを、再度HSPdecoにドラッグ&ドロップする
  5. 解析終了後、start.axと同じフォルダに逆コンパイルされたソースコードstart.hspができている
雑記
  • 最新版のDictionary.csvを使ってもstart.hsp.logに以下のように出力されるけど気にしないでいいよね…(HSPあんまりわからない)。
000001行:deHSPの出力する#structはHSPの公開されている言語仕様には含まれません
  • 逆コンパイルされたソースコードを、HSPで再々?コンパイルした結果、(少なくとも見かけ上は)動作しました。一部ヴァリアントはこのようにして作っているものと思われます。
  • HSPの過去バージョンは以下のリンクからダウンロード可能です。たとえばoomは3.31b3.5b2で制作されているらしいです(readmeより)。
    http://www.onionsoft.net/hsp/file/

参考
Dictionary.csvは下のサイトのものを利用させて頂きました。
CSSの問題?でページが真っ白になるのでview-sourceから引っ張ってきました。

逆コンパイルの手順は下のサイトを参考にさせて頂きました。
http://elona.wikiwiki.jp/?%3A%B2%F2%C0%CF%2F%B2%F2%C0%CF%A4%D8%A4%CE%C6%BB



10/25追記
Elona omake overhaul modify (oom)は、HSP 3.5b2で制作されているため、ヴァリアントwikiで公開されているDictionary.csvでは古すぎるようです。そのため、私の方で新しい命令を追記したものを、上のリンクで公開しました。

12/15追記
HSPdecom1.00を公開しました。
これは、HSPdeco1.00を改良したもので、変数名の復元を行います。

以下詳細
axファイル内のデバッグ領域には、変数名や行数などのデバッグに必要な情報が記録されています。
この情報は通常、リリース段階で取り除かれるのですが、作者さんが変数名をあえて残してくれることがあるらしいです。

ところが、HSPdecoではデバッグ情報の有無に関わらず、変数名はすべてvar_***の形で逆コンパイルされます。
HSPdecomでは、デバッグ情報から変数名を読み取り、逆コンパイル時に復元するようにしました。

参考
http://jbbs.shitaraba.net/bbs/read.cgi/game/58103/1438401066/950-954
http://www.onionsoft.net/hsp/v33/hspsdk/hsp3code.txt