冗長化(HA)構成【Ultramonkey-l4 + Pacemaker + corosync + pcs】

環境

  • CentOS7.6
  • Ultramonkey
  • Pacemaker 1.1
  • Corosync 2

ダウンロードリンク

ネットワーク構成

仮想アプライアンスを使わないで、ESXi上にWebの負荷分散を構成する機会があったのでメモ。 検証はVirtualBoxCentOSを3台立てて行った。

また、クライアントからの要求を処理する方式は、ネットワーク要件に従ってDSRとする。 この方式は応答をLBが処理しないため、スループットがいいという利点と引き換えに負荷分散とほかのサーバが 同じネットワーク上でないといけないなど、デメリットがある点に注意する。

ultramonkey

インストール

yum localinstall -y ultramonkey-repo-3.19-1.el7.x86_64.rpm
yum install -y ultramonkey
cp /usr/share/doc/ldirectord-4.0.1/ldirectord.cf /etc/ha.d/  # 設定ファイルのサンプルをコピー

設定

  • ldirectordの設定
# vim /etc/ha.d/ldirectord.cf
checktimeout=60
checkinterval=30
autoreload=no
quiescent=no

# 仮想IPとルーティング方式
virtual=192.168.100.30:80
        servicename=Web Site
        real=192.168.100.20:80 gate 1
        real=192.168.100.21:80 gate 1
        fallback=127.0.0.1:80 gate 1
        service=http
        scheduler=rr
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"
        receive="Test Page"
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

ldirectordの起動

systemctl start ldirectord

pacemaker+corosync

インストール

yum localinstall -y pacemaker-repo-1.1.21-1.1.el7.x86_64.rpm
yum install -y pacemaker corosync pcs

設定(細かいリソースの内容や意味は参考リンクへ)

systemctl start pcsd
systemctl enable pcsd
firewall-cmd --add-service=high-availability --permanent
firewa--cmd --reload
passwd hacluster  # 両ノードで実行 
pcs cluster auth [node1] [node2] -u hacluster  ## hacluster のpasswordを入力
pcs cluster setup --name [cluster_name] [node1] [node2]
pcs cluster start --all
pcs clulster enable --all 
pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip={仮想IP} cidr_netmask=24 --group [グループ名]
# その他vipcheckやldirectordのRA設定を行う

参考

seccon beginners ctf4b 2020 writeup

成績

P01TERGEIST 1479ポイントで65位でした 5問しか解いてないですが、久々にCTFしたので記録を残します。

Writeup

Spy

ソースを見ると/と/challengeにアクセスできる。 存在するアカウントを選択すればいいので、提供されているemployees.txtを一つずつ 入力してアクセス速度が違うものを選択する。

R&B

先頭の文字を見てrot13とbase64のデコードを繰り返すだけ

emoemoencode

絵文字のunicodeを調べて後ろから2桁の数字を見るとフラグのasciiコード ぽかったのでchr()で変換するだけ

yakisoba

入力によってCorrectとWrongになる問題はとりあえずangrにかけてみることにしている。 以下のコードで普通に通った。

import angr

project = angr.Project('./yakisoba', load_options={'auto_load_libs':False})
simgr = project.factory.simgr()
simgr.explore(find=lambda s: b'Correct!' in s.posix.dumps(1), avoid=lambda s: b'Wrong!' in s.posix.dumps(1))

try:
    found = simgr.found[0]
    print(found.posix.dumps(0))
except IndexError:
    print("Not found")

Noisy equations

coeffsが44個の数字のリストが44個集まったリスト。 これに乱数のノイズを乗せて長さ44のflagをかけ合わせたanswersがある。

coeffsをA, answersをBという行列で表すとB = AF(Fはflagを表す44x1の行列)になる。 よってAの逆行列を求めてFを計算した。 四捨五入を行うときにすっかり忘れていたpython3のround()の仕様に少し迷った。

import numpy as np

# coeffsとansersの取得は省略

A = np.array(coeffs,dtype='float64')
B = np.array(answers,dtype='float64')
inv_A = np.linalg.inv(A)
F = np.dot(inv_A, B)

f = F.tolist()
print(f)
round = lambda x:int((x*2+1)/2)

for s in f:
    num = int(round(s))
    print(chr(num), end="")

しかしこのコードだと

 cuf4b{q4nd0m_534d`24^n4c2554rz^f0s]53cvr16y}

のように完全なフラグではないのでguessする。 「random_seed_is_necessary_for_security」 を思いつくまで30分くらいかかった

【Win10】「*** は短いファイル名として有効ではありません」 Error 1325

対処法

ググっても最初は出てこなかったが、イベントビューアで確認するとError1325らしい。 エラー番号で調べると「Error 1325. ******* is not a valid short file name」と英語が出てきて 「ショートカット名が有効ではありません」が正しい日本語だと分かる。 これはプログラムのインストール時やアンインストール時に起こるエラーらしい。

また、このサイトによるとレジストリがおかしいことが分かったため、***の部分の文字列でレジストリエディタを検索。 関係がありそうな個所を削除することで解決。

原因の考察

アンインストールを正規の方法ではなく、フォルダ削除で行ったり、Cドライブ以外のストレージにインストールしていてドライブレターが 変わったとき(HDDやSSDの抜き差しなど)が原因でレジストリが正しく修正されないことが原因のよう。

参考

直接関係はないが、壊れたレジストリを編集するときに標準のレジストリエディタ(regedit)で操作するのは実質不可能な場合がある。 検索一覧表示や一括置き換えを行うためにはRegisty Finderがおすすめなので あちこちレジストリを編集する場合はインストールしたほうがいい。

【Logicool】 G HUBのインストール方法

f:id:sorasyl:20200425150436p:plain

インストール失敗

G703 Lightspeedを購入したので、DPIを変更するために、公式サイトから最新のGHUBインストーラをDLして インストールしようとしたら「インストール」のボタンを 押したあとウィンドウが消えて何も起こらないという現象が発生した。

ググると - ユーザ名が半角英字じゃないといけない - フォルダのパスが英字のみ(日本語を含まない)状態でないといけない - ほかのLogicool製ソフトウェアをすべてアンインストール&設定ファイル、ログファイル削除 - レジストリをccleanerで掃除しないといけない

などあったが、すべてやってもできなかった。

解決

仕方がないので、コントロールパネルの「アカウントの種類の変更」から「PC設定で新しいユーザを追加」

f:id:sorasyl:20200425143344p:plain
アカウント管理

他のユーザの「その他のユーザをこのPCに追加」で「サインイン情報がありません」、「Microsoftアカウントを持たないユーザを追加する」を押すと、やっとのことでローカルアカウント(Microsoftアカウントではない、そのPCでのみのユーザ)が作成できる。

適当にユーザを作成して管理者に設定しておき、そのユーザでサインインしてGHUBをインストールする。

f:id:sorasyl:20200425144741p:plain
admin user

これでメインのアカウントでもGHUBを使えるようになった。

作成したユーザは削除するなり、管理者を外しておくなりしておく。

1万以上のマウスが使い物にならなくなるところで焦ったが、解決できたのでよしとする。

Electron v7の入門からパック(Electron-Builder)まで【Ubuntu,Mac】

はじめに

ちょっとしたデスクトップアプリをつくるのに使うものといえばElectron!

毎回調べるのも面倒なのでまとめます.

環境

Prerequisits

最小構成

  • Project root
    • package.json
    • main.js
    • index.html

1. Electron で Hello World

package.json を作成

  • yarn init
    • ほとんどそのまま enter でいいが entry point は main.js にするのが Electron の流儀らしい

Electronをインストール

  • yarn add -D electron

main.js を編集

const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;

let mainWindow = null;
app.on('ready', () => {
    // mainWindowを作成
    mainWindow = new BrowserWindow({width:800, height:600});
    // Electronに表示するhtml
    mainWindow.loadURL('file://' + __dirname + '/../../index.html');
    // ChromiumのDevツールを開く
    //mainWindow.webContents.openDevTools();

    mainWindow.on('closed', () => mainWindow = null);
});

index.html を編集

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>PDF Database</title>
</head>

<body>
Hello, World!
</body>

</html> 

Hello World 実行

electron . で起動

f:id:sorasyl:20200124002642p:plain
electronのHello World

2. Electron アプリをパックして配布可能なインストーラやバイナリを作成する

  • UbuntuWindowsアプリを作りたいなど別プラットフォーム向けにパッケージを作るときは依存ライブラリに注意
  • dockerを使えば面倒はない Dockerfile

    Electron-Builder インストール

    yarn add -D electron-builder

package.jsonを編集.

scriptsとbuildを追加する.例は以下の通りで,<*>を自分で置き換える. パッケージのバージョンは2020/01/24時点で最新のもの.

{
  "name": "<project-name>",
  "version": "1.0.0",
  "description": "<project's description>",
  "main": "main.js",
  "author": "<author>",
  "license": "MIT",
  "scripts": {
    "start": "electron .",
    "pack-all": "electron-builder -mwl",
    "pack-win": "electron-builder --win --x64 nsis",
    "pack-mac": "electron-builder --mac --x64 dmg",
    "pack-linux": "electron-builder --linux --x64 deb"
  },
  "devDependencies": {
    "electron": "^7.1.10",
    "electron-builder": "^22.2.0"
  },
  "build": {
    "appId": "<com.example.app>",
    "productName": "<productName>",
    "copyright": "Copyright @ 2020 ${author},
    "mac": {
      "category": "public.app-category.developer-tools",
    }
  }  
}

パック(Linuxの例)

  • yarn run pack-linux
    • dist/に出力される

参考

ElectronとNode.jsの本は持ってないけどいろいろあります.

Javascriptから勉強したい場合はこちらがおすすめ. Kindleで買えばいつでも参照できて便利です.

個人的LaTeX執筆環境【Win, Mac, Linux】

OS

構成

完成イメージ

LaTeX build environment with Atom
Atomで構築するLaTeX環境

Atom

  • エディタは好みで選んでもいいが,開発環境としてセットアップしたエディタやIDEは使いたくなかったのでAtommarkdownLaTeXを使うときの専用エディタにしています.
  • ほぼこのツイートを参考にしています

セットアップ

apm install advanced-open-file document-outline flatwhite-syntax git-plus language-latex latexer open-unsupported-files platformio-ide-terminal wordcount
  • 以下プラグインの簡単な説明
    • language-latex シンタックス  - open-unsupported-files advanced-open-file atomのプロジェクトツリーからPDFをダブルクリックしてデフォルトソフトでPDFを開くため
    • platformio-ide-terminal Ctrl+`でターミナルを開いてビルドするため
    • flatwhite-syntax 目に優しいテーマ
    • git-plus Atomで使えるgitコマンドを増やす
    • wordcount 単語数や文字数の確認,アブストなど文字数に制限があるときに利用
  • 以下は必須ではないがおすすめのプラグイン
apm install file-icon build gitlab-integration sync-settings 
- build ターミナルを利用せずショートカットでビルドする
- file-icon 見た目
- gitlab-integration gitlabのCIが成功したかステータスアイコンで確認できる
- sync-settings 複数の計算機間でatomの設定を共有できる github gistを利用

ファイル構成

  • abstruct/とthesis/でディレクトリを分けている
  • thesisにはなるべくtexファイルしか置かないようにしている
    • buildしてファイル数が多くなるとツリーが見辛くなるため
    • 論文は章ごとに分割してincludeしている
- thesis/
    - src/    # ソースコード
 - img/    # 画像
    - bib/    # bibtex
    - style/    # 論文のスタイルファイル
    - build.sh
    - main.tex
- abstract/
    - build.sh
    - main.tex
- .gitignore
- .gitlab-ci.yml
#!/bin/bash

cd `dirname $0`
function build() {
    cp -f bib/* style/*.sty style/*.cls ./
    latexmk main
    rm -f cites.bib ipsjunsrt.bst *.sty *.cls
}
# 中間ファイル置き場がないなら作成
if [ ! -d ./mid_objs ]; then
    mkdir .mid_objs/
fi
# 中間ファイルを作業スペースに戻す
if [ -n "$(ls ./mid_objs)" ]; then
    mv -f .mid_objs/* ./
fi

build  ## buildを実行

# 中間ファイルを隔離
extension=(
    "*.aux"
    "*.dvi"
    "*.log"
    "*.fdb_latexmk"
    "*.fls"
    "*.blg"
    "*.toc"
    "*.bbl"
)
for ext in "${extension[@]}" ; do
    if ls $ext > /dev/null 2>&1; then
        mv -f $ext .mid_objs/
    fi
done

GitLab

  • 研究の論文はGitLabで管理しているので紹介
    • texをpushするとpdfを作成するようCIを設定している
    • コメントや差分がわかりやすいので添削者にも筆者にも優しい
    • Adobe Readerを使ってPDF内にコメントしてやりとりする必要ないのでLinuxユーザに優しい
  • gitlabの設定ファイル(.gitlab-ci.yml)
    • 出力する論文とアブストのpdf名は自分の環境に合わせて使う
Image: paperist/alpine-texlive-ja:latest

stages:
  - build

build:
  stage: build
  only:
    - master
  before_script:
    - apk add --no-cache su-exec bash
    - addgroup -g 1000 -S box
    - adduser -S -H -G box -u 1000 box
    - chmod +x ./thesis/build.sh ./abstract/build.sh
  script:
    - su-exec box:box ./thesis/build.sh
    - su-exec box:box ./abstract/build.sh
  artifacts:
    name: "$CI_COMMIT_REF_NAME"
    paths:
      - thesis/#論文の名前#.pdf
      - abstract/#アブストの名前#.pdf

メモリダンプ解析 - linux -

はじめに

なぜメモリダンプをするのかや何ができるのかなどはリンク先に書いてあるので 省略する.

Tools

  • LiME(Linux Memory Extractor)
  • volatility

使い方

Prerequisites

sudo apt install -y linux-headers-$(uname -r)
sudo apt install -y build-essential
sudo apt install -y dwarfdump pcregrep libpcre++-dev python-dev python-pip
pip install pycrypto Distorm3 OpenPyxl ujson

Downloads & Build

LiME

git clone https://github.com/504ensicsLabs/LiME
cd LiME/src/
make

volatility

git clone https://github.com/volatilityfoundation/volatility
cd volatility/tools/linux
sudo make -C /lib/modules/$(uname -r)/build CONFIG_DEBUG_INFO=y M=$PWD modules
dwarfdump -di ./module.o > module.dwarf
sudo zip Debian4908.zip module.dwarf /boot/System.map-$(uname -r)
cd ../../ # move to project root
cp tools/linux/Debian4908.zip volatility/plugins/overlays/linux/

dump

sudo insmod lime-$(uname -r).ko "path=dump.mem format=lime timeout=0"
OR
sudo insmod lime-$(uname -r).ko "path=tcp:4444 format=lime timeout=0"
nc 10.10.1.10 4444 > dump.mem

# cleanup
sudo rmmod lime

analysis

# how to use vol.py
python vol.py --info 
# test
python vol.py --plugins=contrib/plugins -f debian-latest.lime --profile=LinuxDebian4908x64 linux_banner

リンク

Intelij 系IDE 出来ること・操作

背景

Android StudioくらいしかIDEを使っていなかったが,学生はJetBrainsのIDEを無料で使えるのでずっと活用したいと思っていた. はじめは操作が分からず使いづらかったが,慣れるとこれ無しではコードを書いたり探索したりするのになくてはならないもの になってきた.Intelij系は操作感を共通にできるので1つ覚えれば他のIDEでも使えるのがよい.

CLion

現在はC言語を扱うことが多いのでCLionというC/C++のためのIDEを使う. Projectを開くとCMakefileを検知したりコードのインデックスをとって検索の高速化をしてるようだ. CMakefileで管理されていないプロジェクトを使うときはMakefileを扱うためにPluginをFile->Settings->PlugingsからMakefileで検索してインストールすればいい.CMakeはよくわからない人でMakefileを使わずに単一ファイルで実行したいときは同じくPluginsからC/C++ Single File Executionをインストールする. これらの昨日がデフォルトで入っていたら最初に迷うことがなかった気がする. Single File Executionの使い方は 1. CMakeList.txtをプロジェクトルートに作成して例のように設定する.

cmake_minimum_required(VERSION 3.14)
project(main)

set(CMAKE_CXX_STANDARD 14)
  1. .cファイルをProjectツリーから開いてエディタの中で右クリック->Add executable for single c/cpp fileを選択する. これによってCMakeList.txtに次の一行が追加される.
add_executable(main main.cpp)
  1. build押す(Ctrl+F9)

  2. Run(Shift+F10)

ショートカットは設定次第で異なるかもしれない.

続き

TBD

ラズパイ(ARM, aarch64) システムコール追加 Adding a system call to aarch64 Linux

背景

x86システムコール追加はよく見るけどarmでやったことは無かった. 調べてもなかなか出てこなかったので残しておく.

変更例

#include <linux/kernel.h>
#include <linux/syscalls.h>

SYSCALL_DEFINE2(newsyscall, int, a, int, b)
{
   printk(KERN_EMERG "newsyscall is called (pid = %d)\n", current->pid);
   return a + b;
}
  • linux/include/uapi/asm-generic/unistd.h
#define __NR_newsyscalls 292
__SYSCALL(__NR_newsyscall, sys_newsyscall)

#define __NR_syscalls 293 /* 元が292だったので+1しておく */

以上.

Raspbian GLIBC upgrade (2.24 -> 2.28 )

背景

諸事情あってGLIBCが2.28出ないと動かないプログラムをraspbianで動かしたかった。 しかしstretchには2.28がない、ソースからのビルドも失敗という状況

解決策

次のRaspbianのバージョンbusterのリポジトリには2.28があるという情報をみたのでaptのソースに追加してインストールした。

$ echo "deb http://ftp.jaist.ac.jp/raspbian/ buster main" >> /etc/apt/sources.list
$ apt update && apt -y install libc-bin

このときapt upgradeすると色々影響が出るかもしれないのでそっとしておき、/etc/apt/sources.listを元に戻した。