tweet:2013:0502_01
ちょいとメモ
あとでまとめなおす。
NetBSD-current@20130502
Routerを作成する前提での設定。
Install時には、Test系、X系、Sourceを除いて全部入れる。
とにかく最初に設定すること
- fstabから cdrom の記述を消す
/dev/cd0a /cdrom cd9660 ro,noauto
- groupを修正し、vipwでaccount追加
- newsyslog.confを修正
- 全てのlogを24時間単位で確保。バックアップを別途確保。
/var/log/authlog 600 7 * 24 Z /var/log/console root:wheel 600 7 * 24 Z /var/log/cron root:wheel 600 7 * 24 Z /var/log/kerberos.log 640 7 * 24 ZN /var/log/lpd-errs 640 7 * 24 Z /var/log/maillog 600 7 * 24 Z /var/log/messages 644 7 * 24 Z /var/log/wtmp root:utmp 664 7 * 24 ZBN /var/log/wtmpx root:utmp 664 7 * 24 ZBN /var/log/xferlog 640 7 * 24 Z
- ntp.confを修正
- Serverを定義する。
server 0.netbsd.pool.ntp.org server 1.netbsd.pool.ntp.org server 2.netbsd.pool.ntp.org server 3.netbsd.pool.ntp.org server time.asia.apple.com server ntp.jst.mfeed.ad.jp server 0.jp.pool.ntp.org server 1.jp.pool.ntp.org server 2.jp.pool.ntp.org server 3.jp.pool.ntp.org
- ssh/sshd_configの書き換え
- Port → どこかのHi-Portに変える
- PermitRootLogin が no であることを確認
- PasswordAuthentication を noにする
- syslog.conf
- 最終的にはsyslogは監視サーバーに飛ばす。
- 以下のEntryを追加。これは、Consoleに出力されたlogを記録するためのもの。
*.err;kern.*;auth.notice;authpriv.none;mail.crit /var/log/console
- このあと、/var/log/consoleをtouchする
- Host固有の設定をする
- /etc/rc.confを修正する
rc_configured=YES wscons=YES hostname=foo.example.org defaultroute="192.0.2.6" # ----- Local configuration ----- sshd=YES sshd_flags="" ssh_keygen_flags="" ntpd=YES ntpd_flags="" # see below for ntpd_chrootdir ntpd_chrootdir="/var/chroot/ntpd" ntpdate=YES ntpdate_flags="-b -s" # May need '-u' thru firewall accounting=YES # uses /var/account/acct newsyslog=NO newsyslog_flags="" # trim log files quota=NO # check and enable quotas pf=NO pf_rules="/etc/pf.conf" pf_flags="" pflogd=NO ppp=NO ppp_peers="" # /etc/ppp/peers to call ifwatchd=NO # execute up/down scripts for in-kernel PPPoE interfaces ifwatchd_flags="-u /etc/ppp/ip-up -d /etc/ppp/ip-down pppoe0" altqd=NO altqd_flags="" inetd=NO inetd_flags="-l" # -l logs libwrap dhcpd=NO dhcpd_flags="-q" rtadvd=NO rtadvd_flags="" powerd=YES powerd_flags="" # power management daemon
- で、
touch /var/account/acct
を実行 - /etc/ifcfg_xxx を作成し、そこにInterface設定を書く
- 追加オプションに関しては、ifconfig <devicename> して capabilities を参照。その後、manすること
# cat ifconfig.re0 up media autoselect inet 192.0.2.1/29 inet6 2001:0DB8::1/64 tso4 ip4csum tcp4csum udp4csum # cat ifconfig.re1 up # cat ifconfig.vlan1 create up vlan 2 vlanif re1 inet 192.0.2.9/29 #
- なお、仮想システム上でFV(HVM)で動かす時にはtso4,tso6(TCP Segmentation Offload)などのHardware Assistedな機能をOffにしておいた方が良いだろう。ifconfigでdeviceのCapabilityを見ればどの機能が使えるか(及び生きているか)が判る。
- 個人のhome dirに.sshを作成し、authorized_keysを設置。
- rootになれることを確認したら、/etc/ssh/sshd_configでPasswordAuthenticationをnoにする
- あとで調べる
- powerd関連
- kyua : 要はatf(automatic testing framework)のreplace.
- rc.conf.d : 要は、/etc/rc.d内に設置されているscriptの置き換え。
- <code>
$NetBSD: MESSAGE.NetBSD,v 1.3 2007/07/11 12:25:53 martti Exp $
If you are running NetBSD 1.5 (or newer), the existing /etc/rc.d/postfix can be forced to start /usr/pkg/sbin/postfix instead of /usr/sbin/postfix, by adding the following lines to /etc/rc.conf.d/postfix:
postfix_command='/usr/pkg/sbin/postfix'
required_files='/usr/pkg/etc/postfix/main.cf' start_cmd='/usr/pkg/sbin/postfix start' stop_cmd='/usr/pkg/sbin/postfix stop' reload_cmd='/usr/pkg/sbin/postfix reload'
Please note that /etc/rc.conf.d/postfix does not exist by default so you need to create that file if you need to override the default settings.
</ccode>
- こんな感じでファイルを作ることで、scriptを色々上書きできる。
細かい設定
最小限の設定をして再起動したら、以下を実施。
- 起動時の設定が正しく動いているかを確認
- sshで正しく接続できることを確認
- これで、作成したaccountとsshdが望み通りに動いているか確認できる
- ntpqで時刻同期状態を確認
- とにかく、まず、CurrentとpkgsrcのSourceを持ってくる。
- これをしないと、Kernelをre-compile出来ない。
- 今回は、マシンパワーが余っているので、ついでに CurrentをCompileするマシンにしておくつもり。
cvs -d :pserver:anoncvs@anoncvs.netbsd.org/cvsroot login
cvs -d :pserver:anoncvs@anoncvs.netbsd.org/cvsroot co src pkgsrc
- sshdにpatchを当てる。
- これによって、sshdに対してroot loginを試みたIP Addressは
/var/db/sshd.blacklist
に記録され、以後そのアドレスからのsshdへのアクセスを無条件に切断する。 - このpatchの大元はtsubaiさんが作成されたものです。感謝。
- tsubaiさんのpatchは2000年頃いただいたものですが、現在ではそのままでは利用できないため、不恰好な修正をしました。修正部分のコードが汚いのはあくまで筆者のせいであり、tsubaiさんのせいではありません。
src/crypto/external/bsd/openssh
にdistディレクトリがあるので、そこに移動$ diff -c dist.org/ dist diff -c dist.org/auth.c dist/auth.c *** dist.org/auth.c Sat Mar 30 01:19:44 2013 --- dist/auth.c Mon May 6 01:35:59 2013 *************** *** 39,44 **** --- 39,46 ---- #include <stdarg.h> #include <stdio.h> #include <string.h> + #include <util.h> + #include <fcntl.h> #include <unistd.h> #include "xmalloc.h" *************** *** 602,607 **** --- 604,638 ---- "authorized principals"); } + static void remember_addr(void); + + void + remember_addr(void) + { + int fd; + struct iovec iov[2]; + const char *remote_ip; + char *black_addr; + size_t addrlen; + char terminate[] = "\n"; + + fd = open("/var/db/sshd.blacklist", O_APPEND|O_WRONLY); + if (fd == -1) + return; + + remote_ip = get_remote_ipaddr(); + addrlen = strlen(remote_ip); + black_addr = malloc(addrlen); + strncpy(black_addr, remote_ip, addrlen); + iov[0].iov_base = (void *)black_addr; + iov[0].iov_len = addrlen; + iov[1].iov_base = terminate; + iov[1].iov_len = 1; + + writev(fd, iov, 2); + close(fd); + } + struct passwd * getpwnamallow(const char *user) { *************** *** 618,624 **** --- 649,658 ---- parse_server_match_config(&options, ci); pw = getpwnam(user); + if (strcmp(user, "root") == 0) + pw = NULL; if (pw == NULL) { + remember_addr(); logit("Invalid user %.100s from %.100s", user, get_remote_ipaddr()); return (NULL); diff -c dist.org/sshd.c dist/sshd.c *** dist.org/sshd.c Sat Mar 30 01:19:45 2013 --- dist/sshd.c Sun May 5 23:10:31 2013 *************** *** 255,260 **** --- 255,262 ---- static void do_ssh1_kex(void); static void do_ssh2_kex(void); + static int check_blacklist(void *); + /* * Close all listening sockets */ *************** *** 1191,1196 **** --- 1193,1202 ---- usleep(100 * 1000); continue; } + if (check_blacklist(&from)) { + close(*newsock); + continue; + } if (unset_nonblock(*newsock) == -1) { close(*newsock); continue; *************** *** 2053,2058 **** --- 2059,2095 ---- exit(0); } + int + check_blacklist(s) + void *s; + { + FILE *fp; + struct sockaddr *sa = s; + char a[64], b[64], *p; + + if (getnameinfo(sa, sa->sa_len, a, sizeof a, NULL, 0, NI_NUMERICHOST)) + return 0; + + fp = fopen("/var/db/sshd.blacklist", "r"); + if (fp == NULL) + return 0; + + while (fgets(b, sizeof b, fp)) { + p = strchr(b, '\n'); + if (p == NULL) + continue; + *p = 0; + if (strcmp(a, b) == 0) { + fclose(fp); + logit("Blacklist %s", a); + return 1; + } + } + + fclose(fp); + return 0; + } + /* * Decrypt session_key_int using our private server key and private host key * (key with larger modulus first). $
- sshdを作成
- cvsでdownloadしたsrcの下に移動
- sh ./build.sh toolsを実行
- cd src/lib/libcrypt
- make
- cd src/crypto/external/bsd/openssl
- make
- cd src/lib/libz
- make
- cd src/crypto/external/bsd/openssh
- make
- su root -c “mv bin/sshd/sshd /usr/sbin/sshd”
- su root -c “chown root:wheel /usr/sbin/sshd”
- su root -c “chmod 555 /usr/sbin/sshd”
- su root -c “/etc/init.d/sshd restart”
- 動作確認
- rootでloginしてみて、sshd.blaacklistにaddressが載ることを確認
- 2回目のアクセスでは、login Promptも出ずに切れたらOK
- sshd.blacklistをクリアし、sshdを再起動する
- cd src/crypto/external/bsd/openssh ; make distclean
- cd src/lib/libz ; make distclean
- cd src/crypto/external/bsd/openssl ; make distclean
- cd src/lib/libcrypt ; make distclean
- NetBSD Kernel作成
- Kernel configuration
sh build.sh kernel=ROUTER
mv sys/arch/amd64/compile/obj/ROUTER/netbsd /
tweet/2013/0502_01.txt · 最終更新: 2013/05/02 01:00 by 127.0.0.1