ホーム » コンピュータ » Linux » Debian (ページ 7)

Debian」カテゴリーアーカイブ

システム

最近の投稿

アーカイブ

カテゴリー

WordPress 5.5 を適用

WordPressを触っていたら、version 5.5 が公開となったみたい。

新しい機能なのか、編集画面に URL 張り付けただけで、↓うまく引用してくれらぁ。

WordPress 5.5「エクスタイン」

Windows 10(2004)とwsl2をインストール

wsl2 を使いたくって、windows insider preview を導入して、そろそろ公開されるはずの Windows10 (ver:2004,build:19041)に更新し、Windows Subsystem for Linux 2 をインストールしてみた。

wslの起動は、いままでもっさりしてたけど、今はconsole開いたら、すぐに使えるな。

ただ、Windows の更新で、カナ漢字変換のキーアサインが元に戻ってら。

homebridge-peopleの設定

homebridgeの記事を探していたら、homebridge-people を見つける。ping の結果を、人感センサーの ON/OFF 情報として扱うことができる。ping のホスト名をスマホのIPアドレスを指定すれば、自宅に居る/居ないとして把握できる。

$ sudo npm install -g homebridge-people
$ emacs .homebridge/config.json
    "platforms": [
        {
            "platform": "People",
            "threshold" : 15,
            "anyoneSensor" : false,
            "nooneSensor" : false,
            "webhookPort": 51828,
            "cacheDirectory": "./.node-persist/storage",
            "pingInterval": 10000,
            "ignoreReEnterExitSeconds": 0,
            "people" : [
                {
                    "name" : "斉藤徹",
                    "target" : "iphonex-tsaitoh",
                    "threshold" : 15,
                    "pingInterval": 10000,
                    "ignoreReEnterExitSeconds": 0
                }
            ]
        }
    ]

本当は、ホームハブを導入することで、Home のオートメーションと連動させて、○○が家に帰ったら、○○するといったことができるんだけど、ホームハブが無いのでできない。そうなってくると、HomePod が欲しくなってくる。

 

EPG番組表とリモコンの連動

ちょいと、お遊び。cablegate の番組表情報から現時点の電子番組表(EPG)を取得し、その番組名をクリックすると、該当するチャンネルに替えるリモコン信号を送るようにプログラムを作ってみた。

本当は、好きな番組を適当に選んで、チャンネル替えたいけど。

画面構成の修正

タップしたチャンネル情報を保存して好きな番組を学習させられないかと、妄想を始めたけど サーバ側は PHP の方が書きやすいので、EPG番組表を PHP でObjectiveに書き直し。でも適当に書いているから、public だらけのクラスが汚いな。

speedtest-cliとrrdtool

インターネットとの通信速度を計測する speedtest-cli で Linux の上で測定できそうなので、毎日測定するようにしてみた。MRTG を単純に使うと5分おきになってしまうので、rrdtool を使って1日1回更新にてデータを生成させる。

#!/usr/bin/perl                                                                                                                             

my $pgname = "speedtest" ;
my $rrdfile = "/var/lib/munin/localdomain/localhost.localdomain-$pgname.rrd" ;
my $graphfile = "/var/cache/munin/www/localdomain/localhost.localdomain/$pgname.png" ;
my $rrdtool = "/usr/bin/rrdtool" ;
my $speedtest = "/usr/local/sbin/speedtest-cli" ;

my $time = time() ;
my $debug = 0 ;

sub fetchvalue {
    my ($upv , $dwv) = @_ ;
    my $upload = 0 , $download = 0 ;
    open( FH , "$speedtest |" ) or die( "Can't open $speedtest." ) ;
    while( my $line =  ) {
        if ( $line =~ /^Upload:\s*([\d\.]+)\s*(M|K|)bit\/s/i ) {
            $upload = $1 ;
            $upload *= 1000000 if ( $2 eq "M" ) ;
            $upload *= 1000 if ( $2 eq "K" || $2 eq "k" ) ;
        }
        if ( $line =~ /^Download:\s*([\d\.]+)\s*(M|K|)bit\/s/i ) {
            $download = $1 ;
            $download *= 1000000 if ( $2 eq "M" ) ;
            $download *= 1000 if ( $2 eq "K" || $2 eq "k" ) ;
        }
    }
    close( FH ) ;
    $$upv = $upload ;
    $$dwv = $download ;
}

sub create {
    my $cmd =
        "$rrdtool create $rrdfile"
        ." --step 86400"
        ." DS:upload:GAUGE:200000:0:U"
        ." DS:download:GAUGE:200000:0:U"
        ." RRA:LAST:0.5:1:7"
        ." RRA:AVERAGE:0.5:3:7"
        ." RRA:MIN:0.5:3:7"
        ." RRA:MAX:0.5:3:7"
        ;
    print $cmd."\n" if ( $debug ) ;
    system( $cmd ) ;
}

sub update {
    # rrdファイルが無ければ作る                                                                                                             
    create()
        unless( -f $rrdfile ) ;
    # 値を取得して更新                                                                                                                      
    my $upv , $dwv ;
    fetchvalue( \$upv , \$dwv ) ;
    my $cmd =
        "$rrdtool update $rrdfile"
        ." N:$upv:$dwv"
        ;
    print $cmd."\n" if ( $debug ) ;
    system( $cmd ) ;
}

sub graph {
    my $start = $time - 3600*24*200 ;
    my $cmd =
        "$rrdtool graph $graphfile"
        ." --imgformat PNG"
        ." --start $start"
        ." --end $time"
        ." --title \"SpeedTest\""
        ." --height 150"
        ." --font DEFAULT:7:Consolas"
        ." --vertical-label \"bit/sec\""
        ." --color FRAME#f3f3f3"
        ." --color AXIS#F3F3F3"
        ." --color SHADEA#f3f3f3"
        ." --color SHADEB#f3f3f3"
        ." --color ARROW#f3f3f3"
        ." COMMENT:\"               cur       avg         min         max\\n\""
        ." DEF:upload=$rrdfile:upload:LAST"
        ." LINE:upload#00FF00:\"Upload  \""
        ." GPRINT:upload:LAST:\"%6.2lf%s /\""
        ." GPRINT:upload:AVERAGE:\"%6.2lf%s /\""
        ." GPRINT:upload:MIN:\"%6.2lf%s /\""
        ." GPRINT:upload:MAX:\"%6.2lf%s \\n\""
        ." DEF:download=$rrdfile:download:LAST"
        ." CDEF:download_minus=download,-1,*"
        ." LINE:download_minus#0000FF:\"Download\""
        ." GPRINT:download:LAST:\"%6.2lf%s /\""
        ." GPRINT:download:AVERAGE:\"%6.2lf%s /\""
        ." GPRINT:download:MIN:\"%6.2lf%s /\""
        ." GPRINT:download:MAX:\"%6.2lf%s \\n\""
        ." > /dev/null"
        ;
    print $cmd."\n" if ( $debug ) ;
    system( $cmd ) ;
}

if ( @ARGV > 0 && $ARGV[0] eq "config" ) {
    create() ;
} elsif ( @ARGV > 0 && $ARGV[0] eq "update" ) {
    update() ;
} elsif ( @ARGV > 0 && $ARGV[0] eq "graph" ) {
    graph() ;
} else {
    update() ;
    graph() ;
}

HomeKit/homebridgeをラズパイで再開

一時期、google home notifier のインストールで削除した Siri を使うための HomeKit 互換の homebridge を raspberry-pi の上に再インストールを行った。

Google Home Mini を喋らせるためにインストールした google home notifier では、node.js を使うため(あとで問題がないと分かったけど)に、一旦機能を止めていたけど、機能の競合の起こりにくい raspberry-pi に暇つぶしも兼ねて homebridge を入れる。

インストールにあたり、赤外線リモコンの制御の python-broadlink を raspberry-pi にインストールしたので、単独でテレビのON/OFF/ビデオ入力切替の cec もあるから、サーバを活用しなくても済む。

手順は、過去の自分のインストールメモを参考。ちょっと手間取ったけど。

ということで、

  • テレビ,チューナー,PS4のON/OFF
  • 2つの照明のON/OFF
  • 室内/室外の温度計の表示

が、Hey, Siri で可能。

geoipdeny より kr, tw, hk を削除

最近、自宅よりアクセスできないサイトがあるみたい。特に日本のページのはずだけど、WiFi を切って携帯キャリア接続にすると、問題なく見える。あるとすれば、自宅のファイアウォールの問題か。

自宅では、IPアドレスの国ドメイン割り振り情報を元に、特定の国の IP アドレスをフィルタで接続を拒否している。対象国は自宅サーバへのアクセス履歴で私に縁の無い国から選んだ。でも、最近ではネットワーク接続的に近隣の国のサーバを経由している場合もある。そうなってくると、韓国kr、台湾tw、香港hk の制限が問題になっている可能性が高い。

ということで、これらの国を削除してフィルタを作り直し。

ファイル操作・リダイレクト・LOG解析

ファイル操作やリダイレクトといったLinuxでのファイルの基本操作については、講義用資料を参照。 実際の操作演習に使うファイルを、Raspberry-Pi によるサーバに入れてある。そのファイルで腕試しをしてね。

ファイアウォールとiptables

インターネットからの攻撃を防ぐには、ファイアウォールが必要となる。外部からの接続をうけるコンピュータは、ファイアウォールがどう設定されているのか把握することが重要。

ファイアウォールとDMZ

ファイアウォールは、パケットの(送信元IPアドレス,送信元ポート番号)、(宛先IPアドレス,宛先ポート番号)を見て、通信を制限するルータであり、専用のファイアウォールではさらに細かい制限を加えたり、通信履歴を保存することができる。

組織向けの外部公開のWebサーバやメールサーバを持つ組織では、外部からの接続をうける必要があり、脆弱性があればサーバは乗っ取りなどの被害に会いやすい。サーバが被害を受けたらファイアウォール内部のコンピュータに被害が広がる(トロイの木馬)のは危険であることから、(1) DMZ(非武装地帯)内部に外部公開のサーバを置き、(2) 対外FireWallで外部からのパケットはすべてDMZだけに通す。(3) 内部FireWall では、DMZ の特定の受信パケットだけ流す様にする。

DMZ内部のサーバは、外部からの攻撃をうけるため、極めて慎重にセキュリティ対策を行う必要がある。

iptables

Linux で FireWall を構築するときには、iptables を用いる。iptables では、主に以下の3つのルール(チェイン)でパケットを制限できる。

  • コンピュータに入ってくるパケットに対するルール(INPUT チェイン)、
  • コンピュータから出ていくパケットに対するルール(OUTPUTチェイン)、
  • コンピュータで中継するパケットに対するルール(FORWARDチェイン)

iptables の設定を見るには、iptables -L を実行する。

$ sudo iptables -L  # すべてのルールを表示
Chain INPUT (policy DROP)
target     prot opt source           destination         
DROP       all  --  anywhere         anywhere      state INVALID
ACCEPT     all  --  192.168.11.0/24  anywhere            
ACCEPT     tcp  --  anywhere         anywhere      tcp dpt:http
ACCEPT     tcp  --  anywhere         anywhere      tcp dpt:https
:
Chain FORWARD (policy DROP)
target     prot opt source           destination         
DROP       all  --  anywhere         anywhere      state INVALID
ACCEPT     all  --  127.0.0.0/8      anywhere            
ACCEPT     all  --  192.168.11.0/24  anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source           destination         
ACCEPT     all  --  anywhere         anywhere      state RELATED,ESTABLISHED

iptables で制限のための設定を間違えると、通信ができなくなるので、基本的な考え方だけを紹介する。

「条件にマッチしたパケットをどうするのか」というルールを、チェインに並べておき、パケットが届くとチェインの先頭からルールを適用し、ACCEPT/REJECT/DROPなどの対応を決める。

iptables でルールを登録する場合は、一般的に以下の書式で、条件1,条件2… をすべて満たすパケットをどうするのかのラベルを最後に記載する。

$ iptables -A チェイン 条件1 条件2 … -j ラベル

$ iptables -P INPUT DROP            # デフォルトポリシーの設定
  # INPUT のルールにどれもマッチしない場合はDROP(パケット廃棄)
$ iptables -P OUTPUT ACCEPT
  # OUTPUT のどのルールにもマッチしなければACCEPT(受信許可)

$ iptables -A INPUT -s 127.0.0.1 -j ACCEPT
  # INPUT の末尾に、"送信元IPが 127.0.0.1 ならACCEPT" を追加

$ iptables -A INPUT --dport 80 -j ACCEPT
  # INPUT の末尾に、"宛先ポートが 80 ならACCEPT" を追加

$ iptables -A INPUT -s 11.22.33.44 -j DROP
  # INPUT の末尾に、"送信元IPが 11.22.33.44 ならDROP" を追加

iptablesのオプション引数
  -P      デフォルトポリシーの設定
  -A      末尾にルールを追加
  -s      送信元IPアドレスの条件指定
  -d      宛先IPアドレスの条件指定
  --sport 送信元ポート番号の条件指定
  --dport 宛先ポート番号の条件指定
  -j      指定ラベルに移動

INPUT chain
  |
<送信元IPが127.0.0.1なら>----ACCEPT
  |
<宛先ポートが80なら>----------ACCEPT
  |
<送信元IPが11.22.33.44なら>--DROP
  |
  DROP

ユーザとリモート処理

Linux ではユーザを切替えながら処理を実行したり、ネットワークを越えて命令を実行することができる。外部から攻撃を受けてバックドアが仕掛けられていて不正侵入をうけているのか確認する時に、どういったユーザの処理を実行しているのか把握し、リモート接続で処理ができるような状態なのか知ることが重要。

ユーザとユーザの切り替え

ユーザ,グループの管理

unix では、ユーザ情報は /etc/passwd , /etc/group で管理している。passwdファイル先頭の、ユーザ番号 0 は、なんでもできる権限を持つシステム管理者 root となっている。ユーザ番号 1~999 は、システムを動かすための特殊なユーザとなっている。1000以上は、実際のユーザに割り当てることが多い。

((( /etc/passwd )))
root:x:0:0:root:/root:/bin/bash
sshd:x:111:65534::/var/run/sshd:/usr/sbin/nologin
tsaitoh:x:1000:1000:Tohru Saitoh,,,:/home/tsaitoh:/bin/zsh
| tsaitoh = ユーザ名
| x       = 昔はパスワードが書いてあった, *ならアカウントロック
| 1000    = ユーザ番号
| 1000    = グループ番号
| Tohru Saitoh,,, = ユーザの名前など
| /home/tsaitoh   = ホームディレクトリ
| /bin/zsh        = シェル
  
((( /etc/group )))
root:x:0:
ssh:x:112:
home:x:1000:tsaitoh
| home = グループ名
| x    = 昔はパスワードが書いてあった, *ならアカウントロック
| 1000 = グループ番号
| tsaitoh = グループに所属するユーザ名(コンマ区切り)

ただし、/etc/passwd, /etc/group は、全ユーザが読めるファイルで、暗号化されたパスワードを覚えるには不向きなので、/etc/shadow , /etc/gshadow に保存されている。

ユーザの確認

自分の情報を確認するには、whoamiid , finger コマンドを用いる。

$ whoami    # ユーザ名を表示
tsaitoh

$ id        # UIDやGIDなどの情報を表示
uid=1000(tsaitoh) gid=1000(home) ....

$ finger    # ユーザの詳しい情報を表示
Login    Name           Tty      Idle  Login Time   Office          Office Phone
tsaitoh  Tohru Saitoh   pts/0          Feb 17 22:47 (192.168.11.xx) 12-3456

su コマンド

ユーザを切り替えるには、su コマンドを用いる(Set User)。別ユーザで命令を実行することもできる。ただし、その別ユーザのパスワードが必要。

$ su root
Password: ●●●●●●●●
# exit

$ su -c whoami root
Password: ●●●●●●●●
root

システム管理者での作業は、危険な命令も実行できる状態なので、作業ミスを減らすためにプロンプトが、# に切り替わる。

ただし、su コマンドは、切り替えるユーザのパスワードが必要である。システム管理作業を複数人で行う場合、管理者パスワードを複数人に教えることになり、セキュリティ的に危険である。

sudo コマンド

そこで、管理者などに登録した人であれば、自分のパスワードで管理者権限を得ることができる sudo (set user do) コマンドを使うのが一般的である。

$ sudo bash
Password: ●●●●●●●● 自分のパスワード
# exit
$ sudo whoami     # 管理者で whoami を実行
root

$ sudo -u foobar  # ユーザ foobar に変更
$ whoami
foobar
$ exit
$ whoami
tsaitoh

システム管理者になれるユーザの設定は、/etc/sudoers に記載されている。一般的に、sudo グループに所属していれば、管理者になれるように設定されていることが多い。

su id bit / スティッキービット

パスワードを変更するpasswdコマンドでは自分のパスワードを変更でき、/etc/passwd や /etc/shadow が書き換えられる。unixのr,w,xの権限だけの知識だと、通常ユーザ自身がpasswd,shadowファイルを書き換えられるのなら、同じファイルに記録されている他のユーザ情報(特にパスワードを変更できるはずである。であれば、他人のパスワードも変更できてしまうのではないのか? 当然、こんなことはできてはいけない。

実は、一時的に他のユーザ権限を借りて作業をするため(システム管理者の権限を借りて作業するため)に、su id bit (スティッキービット)という属性がある。

$ sudo bash
$ passwd
Password: ●●●●●●●
Re enter Password: ●●●●●●●

$ which passwd
/usr/bin/passwd

ls -al /bin/ls
-rwxr-xr-x 1 root root 138856  8月  7  2019 /bin/ls
$ ls -al /bin/passwd
-rwsr-xr-x 1 root root  63960  2月  7 23:54 /usr/bin/passwd

上記の passwd コマンドでは、ファイル属性が – rws r-x r-x となっている。(通常の ls コマンドでは、– rwx r-x r-x となっている。)

su id bit が ON になっているコマンドは、一時的に そのファイル所有者 (/usr/bin/passwd の所有者は root) の権限を借りて命令を実行できる。

ただし、スティッキービットが ON だと、管理者権限で命令を実行することができるが、そのコマンドに不備(脆弱性)があると、システムを乗っ取るためにクラッカーが悪用する場合がある。

((( suid ビットが ON のファイルを探す )))
$ find /usr/bin -perl /u=s -print
/usr/bin/password

リモート作業

ネットワークを越えて命令を実行するには、telnetrshssh コマンドを使う。telnet や rsh コマンドは、通信内容が暗号化されていないため、パケットキャプチャを使われると、パスワードなどを盗むこともできるため、通常は使ってはならない。

telnet (暗号化なしのリモート接続)

$ telnet remote-host   # remote-host という名前のコンピュータに telnet で接続
login: ユーザ名
password: パスワード
$ exit

ssh (暗号化されたリモート接続)

ssh は、通信内容を暗号化して安全にリモートコンピュータで命令を実行するコマンド。リモートコンピュータへの接続(slogin)、リモートコンピュータで命令の実行(ssh)、リモートコンピュータとのファイル転送(scp) などができる。

$ slogin remote-host   # 別コンピュータにlogin
Password: ●●●●●●●●
$ hostname             # 使っているコンピュータ名を調べるコマンド
remote-host
$ exit

$ slogin foobar@remote-host  # 指定したユーザ名(foobar)で接続
Password: foobarのパスワード
$ whoami
foobar
$ exit

$ ssh remote-host ls   # remote-host 上で ls を実行
Maildir

$ ssh foobar@remote-host whoami
foobar

$ scp test.c remote-host:~
  # ファイル test.c を remote-host のホームディレクトリにコピー(アップロード)

$ scp foobar@remote-host:hoge.txt dest-dir
  # リモートホストの hoge.txt を、dest-dir にコピー(ダウンロード)

Google 検索

My Google   Yahoo

Microsoft

ファンサイト