Wednesday, November 8, 2017, 22:48 - OS, OS / Linux
Posted by ELIN
xinetdやincrondでスペースを含む引数を指定すると意図したように動かない
スペースに限らずワンライナを仕込んだり、パイプで繋いだり、リダイレクトでゲロしたり、複数のコマンドを実行させたいときには、まず意図した挙動にならないだろう
一方でcrondはこれを回避して動いてくる

例えば以下のようなperlのワンライナをxinetdで設定する
server = /usr/bin/perl
server_args = -lnpe '...' >/var/log/hoge.log

コード部は省略するが、これの意図するところはログを吐き出したいのだ

ところがこれは往々にしてperlのsyntax errorで止まる

原因はlinuxを使っている人なら簡単に予想できるが、要するにcrondはシェルの上で走らせている(/etc/crontabのSHELLで指定しているのを知っているだろう)のでパイプやリダイレクトを使えるというわけ

ところがxinetdやincrondは何も考えずスペースで区切って渡してしまう

以下のような小文字へコンバートしてエコーするだけのサービスを考える
server = /usr/bin/perl
server_args = -lnpe '$_ = lc($_)'

これはうまく動かない
何も考えず、perlでいうところの"split(/ /,...)"で分解して渡してしまうので、perlのバイナリに渡される引数は...
$ARGV[0] # -lnpe
$ARGV[1] # '$_
$ARGV[2] # =
$ARGV[3] # lc($_)'

こんなんなってしまう、こんな区切り方じゃ動かせる感じがしない

これと同様の悩みは調べればすぐに見付かって、解決方法も至極簡単に書いてある
.shファイルを書いて(例題の場合はそのまま.plに起こせば良いね)そいつをxinetdやincrondから呼び出せばいい

しかしながらたった1行のコマンドやリダイレクトのためだけにファイルに起こすのはちょっと馬鹿馬鹿しい気もするのだ

linuxはwindowsのようなカスみたいなシェルじゃないのでもっと頭のいい(ひねくれた)方法があるだろうと考えた結果、こちら
server = /bin/sh
server_args = -c $* - eval perl -MPOSIX=strftime -lnpe 's/\r//;$.==1&&print$ENV{REMOTE_HOST}." - - [".strftime("%d/%b/%Y:%T %z",gmtime($^T))."] \"$_\"";!length()&&print&&exit;s/^/\t/' >>/var/log/honeypot.log && echo HTTP/1.0 200 OK;echo

パイプやリダイレクトの動作から/bin/shの実行は必須として、evalに被せることで後ろの文字列を実行させる
1行のhttp honeypotの完成だ、めでたしめでたし
1 comment ( 506 views )
Wednesday, March 8, 2017, 16:59 - Misc
Posted by ELIN
TwitterIrcGatewayをDebian Squeeze(6.0)でmono 4.8でかつmonoをインストールしないで動かしたい

なぜこのような要件が生まれたかは個人的環境系の問題なので割愛するものとして、要件を実現させるため必要となるmonoのmakeからTwitterIrcGatewayのmakeとmonoバンドルバイナリの作成手順を簡単に追って記載する


make mono


apt-get install gcc g++ make
wget http://download.mono-project.com/sources/mono/mono-4.8.0.495.tar.bz2
tar jxvf mono-4.8.0.495.tar.bz2
cd mono-4.8.0/
./configure --prefix=/opt/mono
make && make install

なぜか最後のmakeをサボって直接make installしようとするとコケる

後程要求されるlibgdiplusも予めmakeする
apt-get install libgtk2.0-dev
wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-4.2.tar.gz
tar zxvf libgdiplus-4.2.tar.gz
cd libgdiplus-4.2/
./configure --prefix=/opt/mono
make install

こちらはサボっても問題ない


make TwitterIrcGateway


オフィシャルのhttps://github.com/opentig/TwitterIrcGatewayを使ってもよいが、forkしたやつにした
export PATH=/opt/mono/bin:$PATH
apt-get install git
git clone https://github.com/argrath/TwitterIrcGatewayUpdate TwitterIrcGateway
cd TwitterIrcGateway/
xbuild

もしxbuildがNuGetのどうたらでコケる場合はhttpsが証明書関係で失敗しているので更新するとよい
例えば方法として
update-ca-certificates
とか
cert-sync /etc/ssl/certs/ca-certificates.crt
など

monoバンドルバイナリ


cd Bin/Debug/
export PKG_CONFIG_PATH=/opt/mono/lib/pkgconfig/
export AS=as
export CC=cc
export MONO_PATH=.
mkbundle -o TwitterIrcGatewayCLI TwitterIrcGatewayCLI.exe I18N.dll I18N.CJK.dll --deps --static --config /opt/mono/etc/mono/config --config-dir . --machine-config /opt/mono/etc/mono/4.5/machine.config

色々検証したがこのように実行する

config関連は正直動きがよくわからないが、例えばconfig関連のパラメータを与えない場合は以下
System.TypeInitializationException: The type initializer for 'System.Net.WebRequest' threw an exception.
--configや--config-dirが欠けると以下
System.DllNotFoundException: libc
また--staticを与えない場合は以下
./TwitterIrcGatewayCLI: error while loading shared libraries: libmonosgen-2.0.so.1: cannot open shared object file: No such file or directory
と、様々なコケかたをするが、結局2日程検証しても.soがないというもの以外説明できるほど理解できていない
少なくとも自分用に書けば--machine-configは必須と思われる、また理解できないが--configを指定した上で--config-dirも指定しなければ動作しない


最後に


staticで作成しているので必要なものはAddInsとExtraAddIns(とConfigs)とTwitterIrcGatewayCLIのみ
rm *.exe *.config *.mdb *.XML *.dll
このへんは消してもよい
今回の要件的には小さければよいので消してしまう
2 comments ( 2910 views )
Thursday, November 17, 2016, 18:33 - Programing / Misc
Posted by ELIN

B IW/L ID/L
Creature :
: ( )
Health
Stamina
Oxygen
Food
Weight
Damage
Speed
Torpor
Lost

1 comment ( 1630 views )
Saturday, September 27, 2014, 14:14 - Misc
Posted by ELIN
vCenter Server 5.5(以下vCS)でvCSが作ったオレオレ証明書ではなく、オレのオレオレ証明書を使おうとしたら色々と大惨事になった
そもそもvCS 5.5は5.1とはMajor Versionこそ一緒だが、全く別物の構造のようで5.1の情報はアテにしてはいけないことに気付くのに時間がかかった

各種証明書は探せば簡単に見付けることができる
しかしESXiのようにrui.*を入れ替えればいけるんじゃね?という安易な発想を行動に移すとその瞬間に再インストールが確定する
vCSの証明書を正しく入れ替えるにはお経のような長くて面倒くさい意味不明の手順を正確にこなさなければいけない
もし手順を1つでも間違うとその瞬間に再インストールが確定する

さて、証明書を入れ替えるにはvCenter Certificate Automation Tool 5.5(以下vCCAT)を使用する
このツールに関わる情報は
http://kb.vmware.com/selfservice/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=2057340
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2080418
http://d.hatena.ne.jp/ogawad/20130524/1369355700
https://sites.google.com/site/63rabbits2/virtual/vmwareview/vcenter-server/vc_setting
等、どれも内容はほぼ同一だがともかく

簡単に目を通すとおかしいことに気付く
vCCATそのものの情報というよりは証明書そのものに関わる情報が大半を占めていて、肝心のvCCATを使用する部分がこれらを読んでもイマイチイメージできない
従ってどの程度のコストで本当に要件が達成できるのかが予測できないままやることになる

結論から言えばvCCATは署名要求を簡単に作成できる機能と、各種サービスの証明書の更新を一応行うことができる
この更新は署名要求の手順を飛ばしても可能で、つまり既に署名された証明書も更新に用いることも可能だ(と思う、未検証)

大まかな流れはまずvCCATで各種署名要求を作成する
この各種というのは通常であれば
・Single Sign-On
・Inventory Service
・vCenter Server
・vCenter Orchestrator
・Web Client
・Log Browser
・Update Manager
の7種を指す
これら全ての署名要求を承認したら各自身の証明書、及びルートCAまでの証明書を合わせたファイル、いわゆるチェイン証明書を作成した上で各サービスへ"認証し、証明書と鍵のファイルを指定"し更新作業を行う
これはつまり最低でも7回の同じことを繰り返すという頭の悪い作業をするということになる

それでは実際の手順
今回の要件となるのはオレオレ認証局が既に署名しているオレオレ中間認証局がvCSの7つの署名要求を承認し、その証明書を使用すること

最初にvCCATを持ってきてC:\vCCATに展開し、署名要求の作成を行う
ssl-updater.batを管理者権限で実行して"2. Generate Certificate Signing Requests"を選択した後、1~7(8は恐らく不必要だが)までの7回、全て同じことを行うという頭の悪い方法で作成する
このとき入力するパラメータに関してはssl-environment.bat(の281行以降)を変更することである程度簡略化することはできる

このような頭の悪いことをやっていると頭が悪くなってしまうので、ssl-environment.batを編集した後に管理者権限で実行したcmd.exeにて
> cd C:\vCCAT
> (ECHO 2&(FOR /L %I IN (1,1,7) DO @ECHO %I&FOR /L %J IN (1,1,9) DO @ECHO;)&ECHO 9&ECHO 9) >input.tmp
> ssl-updater.bat <input.tmp

と、すれば頭の悪い作業を回避できる
ただ一度ファイルに書いているのがこの方法の頭の悪いところで、これはcmd.exeの"SET /P VAR="の動作の頭の悪さが原因なのだが、もしこれを回避できる方法を誰か知っていたら教えて下さい

次は作成した署名要求を承認するのだが、この機能は前述しているURLを見ればわかる通り、頭の悪いvCCATにはない
ただvCCATはopensslのバイナリを含んでいるので、1つ1つファイルを移動(選択)して1つ1つ署名した後にそれらを1つ1つ移動(保存)する、というようなとてつもなく頭の悪い作業を行う必要はない

このopensslで署名作業を行いにはいくつかの準備が必要になる
vCCATはopensslのバイナリこそ含んではいるが、openssl.cfgを含んでいない
従ってこれを入手する必要がある
> powershell (New-Object System.Net.WebClient).DownloadFile(\"http://git.openssl.org/gitweb/?p=openssl.git;a=blob_plain;f=apps/openssl.cnf;hb=f71d59c70ed65beaa51de719848901284bb1fd04\",\"$pwd/tools/openssl/openssl.cnf\")
このようにwget的なことを実行する

そして要求されるディレクトリとファイルを一時的に作成し
> MKDIR demoCA\newcerts
> COPY /Y NUL demoCA\index.txt
> ECHO 01 >demoCA\serial


オレオレ中間認証局の証明書と鍵を持ってきてC:\vCCATに置く
ファイル名はica.crtとica.keyとし
> SET CA=ica
> FOR /D %I IN (requests\*) DO (ECHO y&ECHO y)|tools\openssl\openssl.exe ca -in %I\rui.csr -keyfile %CA%.key -cert %CA%.crt -out %I\rui.crt -config tools\openssl\openssl.cnf

これで全ての署名要求が承認され、同ディレクトリ以下に証明書が作成される

そしてそれらの証明書チェインを作成する
証明書チェインはルートCAまでの証明書全てを含む必要があるので、今回の場合はオレオレ認証局の証明書も持ってきて、これをca.crtとした上で
> SET CHAIN=ica.crt ca.crt
> FOR /D %I IN (requests\*) DO @(FOR %J IN (%I\rui.crt %CHAIN%) DO @tools\openssl\openssl.exe x509 -in %J) >%I\chain.pem

これで各証明書チェインが作成され、証明書の更新準備が整った

さて、肝心の更新作業となるが、これは今までで最も頭が悪い
vCCAT(ssl-updater.bat)を実行し、1を選択した後、今回は全ての更新作業を行うので8を選択する

何か理解不能の出力が出てくるが、これは何なのかというと作業順番である
つまり18の作業順番を正しく行わなければ爆発して二度とログインできなくなって再インストールすることになるので、なんと作業順番を表示してくれるわけだ
明示しておくと作業順番を表示してくれるだけで、他は何もしてくれない
メインメニューの3以降を総当たりで全て手動で実行しなければならないという、とてつもなく頭の悪い方法で更新しなければならないというわけだ

更にその内容も非常に頭が悪い
何か行おうとする度に証明書とその鍵のパス、管理者アカウントとそのパスワードなど、同じ内容を延々入力し続けることを要求される
例えば入力のログを取るとこのような感じになる (テストされたものではないので、間違っても流さないこと)
入力内容はssl-environment.batを編集することで入力を簡略化できるとは言え、それを踏まえても頭が悪いに尽きる
しかし色々と考えはしたものの、他に有効な方法があるわけでもないのでssl-environment.batを編集してお茶を濁すことになるのだが……

編集すべき項目を挙げると
・*_cert_chain
・*_private_key*
・sso_admin_user
・vc_username

このうち証明書関連に関しては、もし記述した手順通り作業を行っていて、かつ証明書を生成したときと同一のプロセスのcmd.exe(要するに閉じていない場合)が使用できるならば
> CMD /V:ON /C FOR %I IN (sso is vc vco ngc log-browser vum) DO @(FOR /D %J IN (%CD%\requests\*!%I_organizational_unit_name!*) DO @ECHO SET %I_cert_chain=%J\chain.pem^&IF "%I"=="is" (ECHO SET %I_private_key_new=%J\rui.key) ELSE ECHO SET %I_private_key=%J\rui.key) >>ssl-environment.bat
このような雑な方法で書き足すことができる
もしこの方法が使用できないなら
> FOR /D %I IN (requests\*) DO @ECHO %CD%\%I\chain.pem&ECHO %CD%\%I\rui.key
このように出力させ、素直にコピペで対応する

最後のvc_usernameに関しては
rem # Example:
rem # vc_username=administrator

と、書いてあるもののsso_admin_userと同じ値の"administrator@vsphere.local"とするのが正しい
語弊があるが、ともかく初期状態ならば正しい

またsso_admin_userで毎回の入力を省けるものの、パスワードの方は内部的にsso_admin_passwordとsso_master_passwordが使用されているが、これは迷惑なことに毎回クリアしてくれるので、インストール直後の状態だとクソどうでもいいポリシーによってただストレスを倍増させるだけのクソ長いゴミのようなパスワードを入力し続けるという頭の極めて悪い作業を強制されるので、先に"a"とかにしておこう

あとは頭の悪い手順に従って頭の悪い作業を1つのミスもなくこなせば無事証明書は更新される
1つでも間違うと死ぬ

ちなみに
 Review the `Prerequisites for Installing vCenter Server' secion in the vSphere Documentation Center.
ERROR: One or more required parameters are not set or have invalid values:
- The leaf certificate doesn't have any CN or subjectAltName that matches any known IP address of the current machine. Rejecting the chain. To skip this check, set the `ssl_tool_no_cert_san_check' environment variable to 1.

このようなエラーで弾かれる場合は英語で書いてあるとおりssl_tool_no_cert_san_checkを1にしよう
それ以外のエラーで弾かれる場合はもうそれ死んでるから再インストールしよう
1 comment ( 22459 views )
Tuesday, September 23, 2014, 09:45 - OS / Unix, *BSD, Solaris
Posted by ELIN
検索しても同じ問題に直面しているという情報はあれど"これだ"というような明確な回答が見当たらなかったので、普通にやったら何の問題も無く解決できるような簡単な話なのかなあ、と思いつつ似たようなことをやっている情報を見付ける
http://dokuosan.net/zousan/nikki277.html
http://uenomemo.blog31.fc2.com/blog-entry-405.html
http://www.ellinikonblue.com/blosxom/UNIX/NAS4Free/20140312NAS4FreeCompile.html
これらを読む限りは至って普通の方法で動かすことが出来そうではある

pfSense 2.1.5はhttps://doc.pfsense.org/index.php/PfSense_and_FreeBSD_Versionsによると8.3-RELEASE-p16であるので、その環境を作成する
これには8.3のインストールの"Choose Distributions"で"5 Kern-Developer"を選択し、インストール完了後に
# freebsd-update fetch
# freebsd-update install

とし、再起動すればよい (実際には再起動せずともソースコードは8.3p16になっているのでその必要はないが)

もし
# freebsd-update install
Installing updates...install: ///usr/src/crypto/openssl/ssl/s3_cbc.c: No such file or directory
done.

このようなエラーが出る場合は
# mkdir -p /usr/src/crypto/openssl/ssl/
ディレクトリを作成することで回避できるので、作成後にもう一度実行する

さて、8111Gのドライバはこれを書いている現在最新が186なのだが
# cp rtl_bsd_drv_v186 /usr/src/sys/dev/re
# make -C /usr/src/sys/dev/re
Warning: Object directory not changed from original /usr/src/sys/dev/re
@ -> /usr/src/sys
machine -> /usr/src/sys/amd64/include
:> opt_bdg.h
awk -f @/tools/makeobjops.awk @/kern/device_if.m -h
awk -f @/tools/makeobjops.awk @/kern/bus_if.m -h
awk -f @/tools/makeobjops.awk @/dev/pci/pci_if.m -h
cc -O2 -pipe -fno-strict-aliasing -Werror -D_KERNEL -DKLD_MODULE -nostdinc -I. -I@ -I@/contrib/altq -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000 -fno-common -fno-omit-frame-pointer -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-sse3 -mno-mmx -mno-3dnow -msoft-float -fno-asynchronous-unwind-tables -ffreestanding -fstack-protector -std=iso9899:1999 -fstack-protector -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -Wundef -Wno-pointer-sign -fformat-extensions -c if_re.c
if_re.c: In function 're_attach':
if_re.c:2983: error: 'PCIER_LINK_CAP' undeclared (first use in this function)
if_re.c:2983: error: (Each undeclared identifier is reported only once
if_re.c:2983: error: for each function it appears in.)
if_re.c:2984: error: 'PCIEM_LINK_CAP_ASPM' undeclared (first use in this function)
if_re.c:2986: error: 'PCIER_LINK_CTL' undeclared (first use in this function)
*** Error code 1

Stop in /usr/src/sys/dev/re.

雑な方法だがともかく、コケてしまう

少なくともこの定数は
# find /usr/src/sys|xargs grep PCIER_LINK_CAP
というようなことをしても見付からないのでどうしようもない

このようなとき、別のバージョンを試すというのが定石だが、Realtekは最新版の186しか配布していない
ところがダウンロードの際のFTPをちょっと覗いてみると、実は172-186の各種を見付けることができる
全ては試していないが、ともかく結果としてmakeが通せる最も新しいバージョンは184であることがわかっているので184を手に入れる
ただFTPを覗くのは少々面倒なので……
http://b.mikomoe.jp/download/1411430971/attach/rtl_bsd_drv_v184.tgz

makeの前に必要ならばバックアップし
# find /usr/src/sys/dev/re -type f|xargs -I % mv % %.bak
実際にmakeする
# fetch http://b.mikomoe.jp/download/1411430971/attach/rtl_bsd_drv_v184.tgz
# tar zxvf rtl_bsd_drv_v184.tgz
# cp rtl_bsd_drv_v184/* /usr/src/sys/dev/re
# make -C /usr/src/sys/dev/re

と、して完成
バイナリは/usr/src/sys/dev/re/if_re.koなので、これをpfSenseのほうへ移動する

if_re.koは/boot/kernel/if_re.koに配置し、そしてドライバをロード
# kldload /boot/kernel/if_re.ko
これで8111Gがきちんと認識され、動作するようになる (たぶん)

そして最後に/boot/defaults/loader.confの
if_re_load="NO" # RealTek 8139C+/8169/8169S/8110S
この項目を"YES"に変更する
ちなみにYesやyesではなく、確実に大文字で"YES"とすること

またNanoBSD版では/がroであるため、この作業の前後に
# /etc/rc.conf_mount_rw
...
# /etc/rc.conf_mount_ro

として、一時的に書き込めるようにする必要がある
add comment ( 5073 views )

| 1 | 2 | 3 | 4 | Next> Last>>