Category Archives: Linux (Server) - Page 3

ディスククオータに残ったUIDを削除する CentOS5

ディスククオータに残ったUIDが以前より残ってるのが気になっていたので削除してみた

ディスククオータに既に存在しないユーザのUIDが残っている場合の例
# repquota -atv

*** Report for user quotas on device /dev/sda6
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 7839076       0       0          33729     0     0
orbit     --    1192       0       0             80     0     0
#1683     --       0 5242880 6291456             88     0     0

ディスククオータに残っている既に存在しないユーザのUIDを削除
# edquota -p nobody 1683

これで再度確認すると削除されているはずです

参考サイト
Factory-AJ Blog: 削除したユーザが、repquota で表示されるのを削除

SSH HTTPS OpenVPNを全て443ポートで通信させる sslh CentOS5

SSLHとはHTTP, HTTPS, SSH, OpenVPN, tinc, XMPP等のプロトコルを全て443番ポートで公開するプログラムです。
ネットワークの制限された環境だと80番と443番ポートでしか通信を許可されていなかったりします。
このプログラムを使用するとそれらの制限を回避する事ができます。

日本語で解説されたサイトが少ないので簡単に導入方法をメモしておきたいと思います。

Repoforgeリポジトリの追加
# rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm

SSLHのインストール
# yum install sslh

SSLHの設定
# vi /etc/rc.d/init.d/sslh

#!/bin/bash
#
#       /etc/rc.d/init.d/sslh
# sslh          This shell script takes care of starting and stopping
#               sslh - a daemon switching incoming connection between SSH and SSL/HTTPS servers
#
# Author: Andre Krajnik akrajnik@gmail.com
# 2010-03-20
#
#
# chkconfig: 2345 13 87
#
# description: sslh - a daemon switching incoming connection between SSH and SSL/HTTPS servers

# Source function library.
. /etc/init.d/functions

# ./sslh -p  0.0.0.0:8443 -l 127.0.0.1:443 -s 127.0.0.1:22

SSLH="/usr/sbin/sslh" # sslhコマンドまでのパスを書き換えて合わせる
PIDFILE="/var/run/sslh"

# SSLHのポートを8443から443に変更し、HTTPSを8443に変更する(HTTPSサーバの設定を8443にしておく)
# さらに追加したいプロトコルがあれば各自で追加する
# なお、OpenVPNを指定する場合はUDPではなくTCPである必要があると思われます
OPTIONS="--user nobody --pidfile $PIDFILE -p  0.0.0.0:443 --ssl 127.0.0.1:8443 --ssh 127.0.0.1:22 --openvpn 127.0.0.1:1194"

if [ -f /etc/sysconfig/sslh ]; then
        . /etc/sysconfig/sslh
fi

start() {
        echo -n "Starting SSL-SSH-Switch: "
        if [ -f $PIDFILE ]; then
                PID=`cat $PIDFILE`
                echo sslh already running: $PID
                exit 2;
        else
                daemon  $SSLH $OPTIONS
                RETVAL=$?
                echo
                [ $RETVAL -eq 0 ] && touch $PIDFILE
                return $RETVAL
        fi

}

stop() {
        echo -n "Shutting down SSL-SSH-Switch: "
        echo
        killproc sslh
        echo
        rm -f $PIDFILE
        return 0
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status sslh
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $?

SSLHの起動
# service sslh start

SSLHの自動起動
# chkconfig sslh on

参考サイト
SSLH: A SSL/SSH Multiplexer for Linux | Unixmen

CentOS 5 バッファオーバーフロー攻撃 対策

RadHat系OSにはexec-shieldというカーネルレベルでのバッファオーバーフロー攻撃防御機能があるので有効にする方法をメモしておきます。

現在の設定の確認
# cat /proc/sys/kernel/exec-shield
1

1:基本無効
0:無効
2:基本有効(実行ファイルごとに有効にする)
3:基本的に有効(実行ファイルごとに無効にする)

手動による設定
# echo 2 > /proc/sys/kernel/exec-shield

設定ファイルによる設定(下記を追記する)
# vi /etc/sysctl.conf

# Exec Shield provides protection of buffer overflow attacks
kernel.exec-shield = 2

この設定でexec-shieldを有効化しても監視対象のプロセスを再起動しなければ意味は無いようなのでOSごと再起動しておく必要があるようである。

コンソール に iptables が色々 ログ を出力するのを黙らせる

デーモンがコンソールを汚したら行けないだろうという話な訳で、こいつを黙らせます。

klogdのオプションに”-c 4″を加えます。
# vi /etc/sysconfig/syslog
KLOGD_OPTIONS=”-c 4 -x”

syslogを再起動します。
# service syslog restart

参考サイト
iptablesのログをコンソールに表示させない
コンソール画面に[IPTABLES INPUT]等のログが出てきてウザイ件 « こま切れblogの詰め合せ

CentOS 5 ディスククオータ 設定一括変更

数百人分のディスククオータの設定を一括して書き換えたかったため簡単なスクリプトを書きました。
これぐらいだったらbashで書くべきだったかな^^;

#!/usr/bin/perl
##########################################
# ディスククオータ一括設定変更スクリプト
##########################################
use utf8;
use strict;
use warnings;

# /homeからユーザ一覧を取得するコマンド(egrepで除外するユーザを書いておく)
my $home_list_cmd = 'ls -1 /home | grep -E -v "(exclude_user|source_user|lost\+found|aquota.user)"';
# クオータ設定をコピーするコマンド(設定元になるユーザを書いておく)
my $edquota_cmd = 'edquota -p source_user -u ';

# 実行
foreach my $user (split(/\n/, `$home_list_cmd`)){
  my $cmd = $edquota_cmd . $user;
  my $rs = `$cmd`;
}

CentOS 5 ディスククォータファイル チェック 失敗する

ディスククォータファイルをチェックするためquotacheckを実行した場合下記のようにクオータを一回切るように促された。
# quotacheck -a
quotacheck: Quota for users is enabled on mountpoint /home so quotacheck might damage the file.
Please turn quotas off or use -f to force checking.

一度、ディスククォータを無効化し、再度実行した場合正常に実行できた
# quotaoff -av
/dev/sda6 [/home]: user quotas turned off
# quotacheck -a

最後は忘れずに有効化しておく
# quotaon -av
/dev/sda6 [/home]: user quotas turned on

参考サイト
Quotaのチェック方法

Twitter フォロワー同期(フォロー専用)Bot Perl 新API対応

今更感がありますが以前書いたTwitter フォロワー同期(フォロー専用)Bot Perl 作成編についてTwitter APIの仕様変更により使えなくなっていたため修正したものを公開しておきます。

#!/usr/bin/perl
use utf8;
use strict;
use warnings;

# モジュール使用宣言
use Array::Diff;
use Net::Twitter::Lite::WithAPIv1_1;
use YAML::Tiny;
use Encode;
use FindBin;

# 現在のパスから見て設定ファイルを読み込み
my $config = (YAML::Tiny->read($FindBin::Bin . '/config.yml'))->[0];
# OAuth認証
my $twitter = Net::Twitter::Lite::WithAPIv1_1->new(
        traits => ['API::REST', 'OAuth'],
        consumer_key => $config->{'consumer_key'},
        consumer_secret => $config->{'consumer_secret'}
);
$twitter->access_token($config->{'access_token'});
$twitter->access_token_secret($config->{'access_token_secret'});

# 認証失敗時の処理
die('Auth failed:'.$config->{'username'}) unless ( $twitter->authorized ) ;

# ユーザー名を含むユーザー情報を取得
my $cr = $twitter->verify_credentials;
my $own_id = $cr->{id};

my $nextc = -1; # paging default.
my @following_id_list; # outgo

# APIの仕様?から一度に100人までしか取得できないから0が返ってくるまでdoブロックをループ
do{
        # パラメータcursorは前回取得したフォローイングまでの番号が入っている
        my $following_list = $twitter->friends_ids({ id=>$own_id, cursor => $nextc });
        $nextc = $following_list->{next_cursor};
        # 配列からフォローイングのidを取得
        foreach my $id (@{ $following_list->{ids} }){
                push(@following_id_list, $id); # 後で比較するためにフォローイングを配列に保管
        }
}while($nextc!=0);
# 文字昇順でソート
@following_id_list = sort @following_id_list;

$nextc = -1;
my @followers_id_list; # income

# APIの仕様?から一度に100人までしか取得できないから0が返ってくるまでdoブロックをループ
do{
        # パラメータcursorは前回取得したフォロワーまでの番号が入っている
        my $followers_list = $twitter->followers_ids({ id=>$own_id, cursor => $nextc });
        $nextc = $followers_list->{next_cursor};
        # 配列からフォロワーのidを取得
        foreach my $id (@{ $followers_list->{ids} }){
                push(@followers_id_list, $id); # 後で比較するためにフォロワーを配列に保管
        }
}while($nextc!=0);
# 文字昇順でソート
@followers_id_list = sort @followers_id_list;

# 差分を取得(フォローイング)
my $diff_following = Array::Diff->diff(\@following_id_list, \@followers_id_list);

# 差分を取得(フォロワー)
my $diff_followers = Array::Diff->diff(\@followers_id_list, \@following_id_list);

# リムった人をリム返し
foreach my $delid_following (@{ $diff_following->{deleted} }){
        $twitter->destroy_friend({user_id => $delid_following});
}

# フォローした人をフォロー返し
foreach my $delid_followers (@{ $diff_followers->{deleted} }){
        $twitter->create_friend({user_id => $delid_followers});
}

VI(VIM)の簡単な使い方

5年以上もLinux系サーバと戯れときながら今更過ぎますが、これからのLinuxユーザの事を考えVIコマンドの簡単な使い方をメモしておきます。はっきり言ってVIの機能を語り尽くせば本が一冊書けるレベルの量です。O’ReillyでもVIの書籍が出ています。VIを熟知したい人は是非書籍を買ってください。

VI(VIM)コマンドとは

マウスやカーソルキーがキーボードに存在しない時代、UNIX全盛期に作られ非常に長い時間UNIXとともに進化してきたシンプルかつ強力なテキストエディタです。そしてVIを参考に機能を拡張したものがVIMです。基本的にVIMはVIコマンドとして使えるのでVIとして解説します。

VIコマンドを使う主な利点

・他のエディタと異なり基本的にUNIX系OSに標準で入っている
・UNIXの書籍や解説サイトでは非常に高い割合でVIを用いて設定など解説している
・リモート操作時に接続が不意に切れてもEmacsの様にプロセスが暴走しない

本当に基本的な使い方一覧

“$や%や#”はシェル上であるという表示です。各自環境に合わせて読んでください。

起動方法
$ vi ファイル名
上記を実行すると”ノーマルモード”で起動します。
※ 全角文字をファイル名に用いるのは文字化けの元です。半角英数を使いましょう。
※ 白文字をファイル名に用いるのは混乱の元です。アンダースコアを使いましょう。

記述方法
ノーマルモードから”i”キーを押す事により”挿入モード”となり文字入力が可能になります。
ノーマルモードに戻りたい場合は”ESC”キーを押します。

保存方法
ノーマルモードより”:w”を入力し”Enter”キーを押します。

終了方法
保存後に終了する場合は”:wq”を入力し”Enter”キーを押します。
保存せず終了する場合は”:q!”を入力し”Enter”キーを押します。

※ ファイルを編集する前には必ず元のファイルをバックアップする癖を付けましょう。
※ ファイルを編集する時は必ず編集したらこまめに保存する癖を付けましょう。

覚えておくと便利な操作一覧(ノーマルモード上での操作)

直前のコマンド操作を取り消す

”u”キーを押すと直前の操作を取り消す事ができます。
※ 現代の一般的なエディタとは異なり挿入モードもコマンド単位として戻ります。

ファイルの表示場所を変える

ファイルの先頭に移動
削除したい文字にカーソルを合わせ”g”キーを2回押すと先頭に移動する事ができます。

ファイルの最後に移動
削除したい文字にカーソルを合わせ”shift”キーと”g”キーを同時に2回押すと最後に移動する事ができます。

行番号の表示

”:set number”を入力し”Enter”キーを押します。
表示を消す場合はノーマルモードより”:set nonumber”を入力し”Enter”キーを押します。

指定する行番にカーソル移動

”:カーソルを移動させたい行数”を入力し”Enter”キーを押します。

文字列検索

”:/検索ワード(正規表現使用可能)/”を入力し”Enter”キーを押します。
検索結果は”n”キーを押すことにより次を検索できます。

文字列置換

個々に置換
”:/検索ワード(正規表現使用可能)/置換後の文字/”を入力し”Enter”キーを押します。

カーソルのある行全てを置換
”:/検索ワード(正規表現使用可能)/置換後の文字/g”を入力し”Enter”キーを押します。

ファイル内全て再帰的に置換
”:%s/検索ワード(正規表現使用可能)/置換後の文字/g”を入力し”Enter”キーを押します。

ノーマルモードからの削除

ノーマルモードからの文字削除
削除したい文字にカーソルを合わせ”x”キーを押すと文字を削除する事ができます。

ノーマルモードからの行削除
削除したい文字にカーソルを合わせ”d”キーを2回押すと文字を削除する事ができます。

文字コードを指定して開き直す

”:e ++enc=文字エンコーディング”を入力し”Enter”キーを押します。

ClamAVによるOS破壊を全力で阻止してみる

以前ClamAVをインストールしてremoveオプションを付け実行したところカーネルイメージを”破損した実行ファイル”と検知し削除されて起動しなくなったという事件が起きて以来、ClamAVでremoveオプションをつける事はなくなったのですがやっぱり誤検知しているようなので対策したいと思います。

誤検知中の様子。。。

/boot/vmlinuz-2.6.18-238.9.1.el5: Heuristics.Broken.Executable FOUND
/boot/vmlinuz-2.6.18-164.el5: Heuristics.Broken.Executable FOUND
/boot/vmlinuz-2.6.18-348.6.1.el5: Heuristics.Broken.Executable FOUND
/boot/vmlinuz-2.6.18-238.19.1.el5: Heuristics.Broken.Executable FOUND
/boot/vmlinuz-2.6.18-238.5.1.el5: Heuristics.Broken.Executable FOUND

設定ファイル(clamd.conf)の下記の行を次のように書きかえる。
DetectBrokenExecutables yes
DetectBrokenExecutables no

これで自分自身を”駆除”することはなくなりそうですね。

CentOS 5.9 ClamAV SELinux環境で実行する

ClamAVをインストールして起動しようとしたらエラーを吐いたのでメモ
# service clamd start

Starting Clam AntiVirus Daemon: LibClamAV Warning: RWX mapping denied: Can't allocate RWX Memory: Permission denied
LibClamAV Warning: Bytecode: disabling JIT because SELinux is preventing 'execmem' access.
Run  'setsebool -P clamd_use_jit on'.

言われた通りにSELinuxを設定しようとコマンドを実行してもエラーを吐く
# setsebool -P clamd_use_jit on

libsemanage.dbase_llist_set: record not found in the database
libsemanage.dbase_llist_set: could not set record value
Could not change boolean clamd_use_jit
Could not change policy booleans

下記の様にコマンドを実行すれば良いらしい。
# setsebool -P clamd_disable_trans on

正常に起動できる事を確認する
# service clamd start

Starting Clam AntiVirus Daemon:                            [  OK  ]