linuxで中国からの通信を遮断


ニュースを見ていたら、9月18日は、中国からのサイバー攻撃が増えるらしい。

参考

理由は歴史的な背景にあるようだが、システム管理屋としては、攻撃に対しては何らかの防御策を準備しなくてはならない。

理想は全てのシステムを、脆弱性など無い万全のものにしておくことだが、なかなかそんな理想なんて言ってられない。

ということで、手っ取り早くやるとなると、中国からの通信をブロックしてしまえばいいんじゃん。という安易な考え。

国別のIPアドレス割り当て情報は、apnicのサイトでわかるので、そちらを元にiptablesでブロックするようにした。

実際に攻撃を受けて、どうしょうもない時に、以下のファイルをダウンロードして、rootで実行

中国フィルタ用iptables(cn-filter.sh)

※毎日更新

ダウンロードして、以下のように実行

ファイルの中身

有無を言わさずINPUTの一番目のポリシーに差し込むので、どんな環境でも使えるはず。

一応iptablesを設定するので、出来ればリモートじゃなくコンソール画面で!

最悪通信出来なかった場合を考え、cronで数分後に無効にする設定もおすすめ。

コマンドで入れ込むので、保存はされません。起動時に有効にしたい場合は、各OSの設定にしたがってください。

一度作れば簡単だったので、韓国版も

韓国フィルタ用iptables(kr-filter.sh)


ubuntu 12.10 で SPICE


仮想化と言えば、最近は一貫してkvm(libvirt経由の更にvirt-managerでの)だが、

サーバ用途では全く問題ないが、クライアントとなるとグラフィックがどうしても貧弱で

ちょっとだけ困っていた。最近のvirt-managerの設定をみると、VNCと同じ箇所で、

spiceなるものが選べるようになっていたのだが、ちょっと調べてみたらなんか良さそうなので

とりあえず試してみることにした。spiceに詳細については、ネットで調べるとあまり多くないですが

情報が得られます。

まず、必要パッケージのインストール

 

 

 

virt-manager(仮想マシーンマネージャー)で、ディスプレイを、spiceに
ビデオカードを、qxlに変更します。

なぜか起動時に、
unsupported configuration: spicevmc not supported in this QEMU binary
とかってエラーがでます。

インストールした、qemu-kvm-spiceコマンドを使ってないのが問題なようなので
virshコマンドで手動で変更します。

 

 

を、

 

に変更する。

とりあえず、これで仮想マシンは起動します。

起動したゲスト側で、ドライバが必要な場合は、別途インストールが必要です。
ゲストがWindowsの場合は、
http://spice-space.org/download.html
から、「Guest」の「Windows binaries」をゲストのWindowsにインストールします。

なんかインストール時に聞かれますが、テキトーに答えれば進めました。

最近のウィンドウズだと、ドライバに署名が無いとインストール出来ない場合があるのですが、

なんとかすれば回避できると思います(雑)

spiceにしてみてですが、なんとなく快適になったような気がします。

品質はあまり良くないですが音もでます。


readelfなんて使ったことないし、バイナリに弱すぎ


C言語を挫折した人間なので、バイナリとかアセンブラとかは全く分からない。

スクリプト言語サイコーなのだが、どうしたってサーバを動かしていれば

C言語で書かれた、デーモンやら何やらでトラブルは起きる。

先日もデーモンプログラムで、どうも変な挙動をしていたのだが

古いプログラムで、しかもソースから入れていることもあって

なんとか自力で原因究明しなくてはならなくなった。

元々、デバッグ情報付きでコンパイルされてなく

オプションを付けてコンパイルしなくてはならなかったのだが

付けたはずのオプションが、どっかで無効になったのか

gdbで実行すると、デバッグ情報が無いよ! と怒られまくった。

デバッグ情報が付かなかったのは、Makefile内の修正箇所ミスだったのだが

都度gdbを実行してから怒られており、もっと簡単に知る方法はないのかと調査した。

 

  • 結果

[code]

$ readelf -S 実行ファイル

[/code]

だそうです。

 

  • 試しにやってみた

[code]

$ readelf -S httpd
There are 36 section headers, starting at offset 0x4f96dc:

Section Headers:
[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
[ 0]                   NULL            00000000 000000 000000 00      0   0  0
[ 1] .interp           PROGBITS        08048114 000114 000013 00   A  0   0  1
[ 2] .note.ABI-tag     NOTE            08048128 000128 000020 00   A  0   0  4
[ 3] .hash             HASH            08048148 000148 009430 04   A  4   0  4
[ 4] .dynsym           DYNSYM          08051578 009578 015070 10   A  5   1  4
[ 5] .dynstr           STRTAB          080665e8 01e5e8 015ea1 00   A  0   0  1
[ 6] .gnu.version      VERSYM          0807c48a 03448a 002a0e 02   A  4   0  2
[ 7] .gnu.version_r    VERNEED         0807ee98 036e98 0000a0 00   A  5   3  4
[ 8] .rel.dyn          REL             0807ef38 036f38 000060 08   A  4   0  4
[ 9] .rel.plt          REL             0807ef98 036f98 0015c8 08   A  4   b  4
[10] .init             PROGBITS        08080560 038560 0000e7 00  AX  0   0 16
[11] .plt              PROGBITS        08080648 038648 002ba0 04  AX  0   0  4
[12] .text             PROGBITS        08083200 03b200 0f73a4 00  AX  0   0 64
[13] .fini             PROGBITS        0817a5a4 1325a4 00001b 00  AX  0   0  4
[14] .rodata           PROGBITS        0817a5c0 1325c0 043ddc 00   A  0   0 32
[15] .eh_frame_hdr     PROGBITS        081be39c 17639c 00004c 00   A  0   0  4
[16] .eh_frame         PROGBITS        081be3e8 1763e8 00021c 00   A  0   0  4
[17] .data             PROGBITS        081bf620 176620 011640 00  WA  0   0 32
[18] .dynamic          DYNAMIC         081d0c60 187c60 000118 08  WA  5   0  4
[19] .ctors            PROGBITS        081d0d78 187d78 000008 00  WA  0   0  4
[20] .dtors            PROGBITS        081d0d80 187d80 000008 00  WA  0   0  4
[21] .jcr              PROGBITS        081d0d88 187d88 000004 00  WA  0   0  4
[22] .got              PROGBITS        081d0d8c 187d8c 000af4 04  WA  0   0  4
[23] .bss              NOBITS          081d1880 188880 00822c 00  WA  0   0 32
[24] .comment          PROGBITS        00000000 188880 0059cd 00      0   0  1
[25] .debug_aranges    PROGBITS        00000000 18e250 000b18 00      0   0  8
[26] .debug_pubnames   PROGBITS        00000000 18ed68 00c7a5 00      0   0  1
[27] .debug_info       PROGBITS        00000000 19b50d 2ee565 00      0   0  1
[28] .debug_abbrev     PROGBITS        00000000 489a72 0125c5 00      0   0  1
[29] .debug_line       PROGBITS        00000000 49c037 02d6a8 00      0   0  1
[30] .debug_frame      PROGBITS        00000000 4c96e0 0101f0 00      0   0  4
[31] .debug_str        PROGBITS        00000000 4d98d0 01cc33 01  MS  0   0  1
[32] .debug_ranges     PROGBITS        00000000 4f6503 003090 00      0   0  1
[33] .shstrtab         STRTAB          00000000 4f9593 000147 00      0   0  1
[34] .symtab           SYMTAB          00000000 4f9c7c 0208b0 10     35 b85  4
[35] .strtab           STRTAB          00000000 51a52c 025b11 00      0   0  1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

[/code]

.debug_infoというセクションが有ると、デバッグ情報付きです。

とあるapacheはデバッグ情報付きでした。

[code]

$ readelf -S /usr/lib/firefox/firefox
There are 29 section headers, starting at offset 0x12180:

Section Headers:
[Nr] Name              Type             Address           Offset
Size              EntSize          Flags  Link  Info  Align
[ 0]                   NULL             0000000000000000  00000000
0000000000000000  0000000000000000           0     0     0
[ 1] .interp           PROGBITS         0000000000000270  00000270
000000000000001c  0000000000000000   A       0     0     1
[ 2] .note.ABI-tag     NOTE             000000000000028c  0000028c
0000000000000020  0000000000000000   A       0     0     4
[ 3] .note.gnu.build-i NOTE             00000000000002ac  000002ac
0000000000000024  0000000000000000   A       0     0     4
[ 4] .gnu.hash         GNU_HASH         00000000000002d0  000002d0
0000000000000174  0000000000000000   A       5     0     8
[ 5] .dynsym           DYNSYM           0000000000000448  00000448
0000000000000a20  0000000000000018   A       6     3     8
[ 6] .dynstr           STRTAB           0000000000000e68  00000e68
000000000000082e  0000000000000000   A       0     0     1
[ 7] .gnu.version      VERSYM           0000000000001696  00001696
00000000000000d8  0000000000000002   A       5     0     2
[ 8] .gnu.version_r    VERNEED          0000000000001770  00001770
0000000000000110  0000000000000000   A       6     6     8
[ 9] .rela.dyn         RELA             0000000000001880  00001880
00000000000003a8  0000000000000018   A       5     0     8
[10] .rela.plt         RELA             0000000000001c28  00001c28
0000000000000570  0000000000000018   A       5    12     8
[11] .init             PROGBITS         0000000000002198  00002198
0000000000000018  0000000000000000  AX       0     0     4
[12] .plt              PROGBITS         00000000000021b0  000021b0
00000000000003b0  0000000000000010  AX       0     0     16
[13] .text             PROGBITS         0000000000002560  00002560
000000000000ad68  0000000000000000  AX       0     0     16
[14] .fini             PROGBITS         000000000000d2c8  0000d2c8
000000000000000e  0000000000000000  AX       0     0     4
[15] .rodata           PROGBITS         000000000000d2e0  0000d2e0
0000000000000ef4  0000000000000000   A       0     0     16
[16] .eh_frame_hdr     PROGBITS         000000000000e1d4  0000e1d4
0000000000000784  0000000000000000   A       0     0     4
[17] .eh_frame         PROGBITS         000000000000e958  0000e958
0000000000002504  0000000000000000   A       0     0     8
[18] .tbss             NOBITS           0000000000211a20  00011a20
0000000000000009  0000000000000000 WAT       0     0     8
[19] .ctors            PROGBITS         0000000000211a20  00011a20
0000000000000010  0000000000000000  WA       0     0     8
[20] .dtors            PROGBITS         0000000000211a30  00011a30
0000000000000010  0000000000000000  WA       0     0     8
[21] .jcr              PROGBITS         0000000000211a40  00011a40
0000000000000008  0000000000000000  WA       0     0     8
[22] .data.rel.ro      PROGBITS         0000000000211a50  00011a50
0000000000000178  0000000000000000  WA       0     0     16
[23] .dynamic          DYNAMIC          0000000000211bc8  00011bc8
0000000000000200  0000000000000010  WA       6     0     8
[24] .got              PROGBITS         0000000000211dc8  00011dc8
0000000000000238  0000000000000008  WA       0     0     8
[25] .data             PROGBITS         0000000000212000  00012000
0000000000000070  0000000000000000  WA       0     0     16
[26] .bss              NOBITS           0000000000212070  00012070
00000000000003b8  0000000000000000  WA       0     0     16
[27] .gnu_debuglink    PROGBITS         0000000000000000  00012070
000000000000000c  0000000000000000           0     0     1
[28] .shstrtab         STRTAB           0000000000000000  0001207c
00000000000000fe  0000000000000000           0     0     1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

[/code]

ubuntu 12.04 amd64にパッケージで入れたfirefoxは.debug_infoというセクションはありません。

.gnu_debuglink があやしい気がしますが詳細は調べてません。

 


debianパッケージをサイズ順に並べる方法


小さいシステムが好きな人間としては、どのパッケージがどのくらいディスク容量を消費しているか知りたくなる。

debian系のパッケージ管理なら以下のコマンドで一発

mysql関連が結構使ってますね。


androidでPCを操作(RemoteDroid)


自宅PCは、TV出力専用である。

テレビの下に置いてあり、キーボード、マウスは繋いでいない。

今までは、ノートPCからsynergyでキーボード、マウスを共有してたのだが、

Nexus7購入と共に、android端末が、PCのコンソールの代わりにならないかと考え

調べてみたところ、何個か選択肢がありそうだ。

結構情報が多いのが、VNCでの接続。

もともと画面の共有が目的のソフトなので、そこまでは不要なので却下。

次に今まで使っていた、synergyのandroid版。

日本語情報は、皆無だがなんとなく却下。

一応理由としては、synergyは操作される側(今回はTV接続PC)が、

操作する側を指定して、ソフトを起動する必要がある。

セキュリティ的には好ましいのだが、既に一つ起動していて複数起動が出来るか疑問だし

Nexus7側のIPは動的だしちょいと面倒。

そこで有力候補は、RemoteDroidとなった。

android側は、RemoteDroidをインストールして、操作するPCの

IPアドレスを指定するだけ。

操作される側は、RemoteDroidのサイトより、アプリをダウンロードして

起動しておくだけ。

自分のPC環境は、ubuntuなのだが、PCのソフトもjavaで作られていて

ubuntuでも問題なく動く。これは非常に嬉しい。

これだけ。うーん簡単。

Windows環境ならバッチファイルが同梱されているのでそれをクリックするだけのはず。

セキュリティを考えると、認証も無いのでちょっと不安だけど

自宅ネットワーク内ならまー気にする必要もないと思う。


多分自分のシェルがこれになったら泣きたくなる(rbash)


rbash

bashを-rオプションで起動するか、bashのシンボリックリンクがrbashになっているか。

多分大抵のディストリビューションでは、rbashのシンボリックリンクが作られていると思う。

結構古いbashからあった機能らしい。確認した一番古いbashでversion 2.05なのでソートー昔からある。

実際に使ってみると、

 

なんも出来ねー

一応manページによると、以下が出来無いらしい。

  • cd を使ってディレクトリを変更すること
  • SHELL, PATH, ENV, BASH_ENV の値の設定や設定取り消しを行なうこと
  • / を含むコマンド名を指定するこ
  • 組み込みコマンド .  の引き数として / を含むファイル名を指定すること
  • 組み込みコマンド hash に対するオプション -p の引数として / を含むファイル名を指定すること
  • 起動時にシェル環境から関数定義をインポートすること
  • 起動時にシェル環境から SHELLOPTS の値を展開すること
  • リダイレクション演算子 >, >|, <>, >&, &>, >> を使ってリダイレクトを行 なうこと
  • 組み込みコマンド exec を用いて、シェルを別のコマンドに置き換えること
  • 組み込みコマンド enable に対する -f オプションと -d オプションを使って、組み込みコマンドを追加・削除すること
  • 組み込みコマンド command に -p オプションを指定すること
  • set +r や set +o restricted を用いて制限モードを解除すること

かなり厳しい制限だが、共有レンタルサーバなどでユーザにshellを開放する場合は

使えるかもと思った。

chroot+sshが理想なんだろうけど、opensshにパッチあてたり、必要なコマンドをchroot下に用意したりするより

簡単なのではと思う。

特にパッチあては、パッケージ管理から外れるので、sshなんて重要なものでは極力避けたいし。

最近はディストリビューション標準パッケージで、chroot可なものもあるのだろうか。

追加

あれ?


シェルスクリプトで、アルファベット一覧を使いたい時


もっと楽な方法がありました。

シェルスクリプトで、アルファベット一覧を使いたい時がある。

例えば、

「ほげA」

「ほげB」

「ほげC」

なんてディレクトリを作りたい時、数字であればseqを使えばそれで済むのだが

アルファベットだと簡単な方法が分からない。(あるのかもしれないが)

それでたどり着いたのが、以下の方法

 

 

 

ワンライナーだとこんな感じ

 

 

簡単な説明としては、seqで65から90まで出力します。
これは、asciiコードの10進数で、A〜Zになります。

※詳細は、man asciiで確認

次にprintfで16進数にして、文字の前に\xを付けてあげます。

 

これを、printfで%bで出力します。

 

 

と、こんな感じです。

小文字にしたい場合は、97から122にしてあげます。

これでシェルスクリプト時に、アルファベット一覧が使えます。

pythonならこんなの感じ?