Fork me on GitHub
Suzf  Blog

[译] Moving a Volume Group to Another System

您可以将整个LVM卷组移动到另一个系统。建议您在执行此操作时使用 vgexport 和 vgimport 命令。

vgexport:使非活动卷组无法访问系统,它允许你分离物理卷。
vgimport:在执行vgexport命令使其禁用之后,再次使机器可以访问卷组。

一个系统卷组移动到另一个系统,请执行下列步骤:

1. 确保现在没有用户正在访问卷组中活动卷上的文件,然后卸载逻辑卷。

2. 使用vgchange命令的-a n 标记卷组为无效,以防止卷组上的任何进一步的活动。

3. 使用vgexport命令导出卷组。这可以防止由要从中删除它在系统被访问。

当您导出卷组后,在你执行pvscan命令时,物理卷将显示为导出卷组。如下面的例子。

# pvscan
PV /dev/sda1    is in exported VG myvg [17.15 GB / 7.15 GB free]
PV /dev/sdc1    is in exported VG myvg [17.15 GB / 15.15 GB free]
PV /dev/sdd1   is in exported VG myvg [17.15 GB / 15.15 GB free]
...

当系统下一次关机,就可以拔下构成卷组的磁盘,并将它们连接到新的系统。

4. 当这些磁盘被插入到新的系统之后, 使用 vgexport 命令导入,使得新的系统可以访问它。

5. 激活卷组 使用 vgchange -ay volune-group

6. 挂载文件系统,使其可用。

源文:Moving a Volume Group to Another System

 

dokuwiki 重置管理员密码

一直觉得如果写成系列的技术文章,用 wp 显得有点力不从心。最近 GitBook 也是不错的。
翻到一年多前,茫然想起自己曾经耍过 DokuWiki, 那么便拿出来耍耍吧。毕竟时间太久远了。
自己设置的密码已经抛在脑后了。也懒得想了,重置密码吧。简单粗暴有疗效。

后期会在网站中考虑 加入 wiki 或者 gitbooks, 欢迎小伙伴们前来围观。

dokuwiki 管理员默认用户名: admin
如果采用简单验证方法,用资料存储在文件中,第二列即为密码的 hash值.

cat conf/users.auth.php
# users.auth.php
# <?php exit()?>
# Don't modify the lines above
#
# Userfile
#
# Format:
#
# login:passwordhash:Real Name:email:groups,comma,seperated


lucy:$6$hdLEXRS9$X4lQKUDKoCnk9ubS.XPKR1:Lucy:[email protected]:admin,user



^_^[13:38:12][[email protected] tmp]#cat crypt_test.php 
<?php
// 设置密码
$password = 'yourpassword';

// 获取散列值,使用自动盐值
$hash = crypt($password);
echo "password: $password\n";
echo "hash: $hash\n";

?>

^_^[13:38:16][[email protected] tmp]php crypt_test.php 
password: yourpassword
hash: $1$rtfdScJg$uQh7Dl6bFFwgtI6iWDkcv.

将旧的hash 值替换为新的hash 就可以从新登录了。
同级目录下有 ./conf/acl.auth.php 文件是用来控访问权限的。

密码散列安全

节选自 PHP manual

相关链接  Wooyun

本部分解释使用散列函数对密码进行安全处理背后的原因, 以及如何有效的进行密码散列处理。

  1. 为什么需要把应用程序中用户的密码进行散列化?
  2. 为何诸如 md5 和 sha1 这样的常见散列函数不适合用在密码保护场景?
  3. 如果不建议使用常用散列函数保护密码, 那么我应该如何对密码进行散列处理?
  4. “盐”是什么?
  5. 我应该如何保存“盐”?

为什么需要把应用程序中用户的密码进行散列化?

当设计一个需要接受用户密码的应用时, 对密码进行散列是最基本的,也是必需的安全考虑。 如果不对密码进行散列处理,那么一旦应用的数据库受到攻击, 那么用户的密码将被窃取。 同时,窃取者也可以使用用户账号和密码去尝试其他的应用, 如果用户没有为每个应用单独设置密码,那么将面临风险。

通过对密码进行散列处理,然后再保存到数据库中, 这样就使得攻击者无法直接获取原始密码, 同时还可以保证你的应用可以对原始密码进行相同的散列处理, 然后比对散列结果。

需要着重提醒的是,密码散列只能保护密码 不会被从数据库中直接窃取, 但是无法保证注入到应用中的 恶意代码拦截到原始密码。

为何诸如 md5()sha1() 这样的常见散列函数不适合用在密码保护场景?

MD5,SHA1 以及 SHA256 这样的散列算法是面向快速、高效 进行散列处理而设计的。随着技术进步和计算机硬件的提升, 破解者可以使用“暴力”方式来寻找散列码 所对应的原始数据。

因为现代化计算机可以快速的“反转”上述散列算法的散列值, 所以很多安全专家都强烈建议 不要在密码散列中使用这些散列算法。

如果不建议使用常用散列函数保护密码, 那么我应该如何对密码进行散列处理?

当进行密码散列处理的时候,有两个必须考虑的因素: 计算量以及“盐”。 散列算法的计算量越大, 暴力破解所需的时间就越长。

PHP 5.5 提供了 一个原生密码散列 API, 它提供一种安全的方式来完成密码 散列验证。 PHP 5.3.7 及后续版本中都提供了一个 » 纯 PHP 的兼容库

PHP 5.3 及后续版本中,还可以使用 crypt() 函数, 它支持多种散列算法。 针对每种受支持的散列算法,PHP 都提供了对应的原生实现, 所以在使用此函数的时候, 你需要保证所选的散列算法是你的系统所能够支持的。

当对密码进行散列处理的时候,建议采用 Blowfish 算法, 这是密码散列 API 的默认算法。 相比 MD5 或者 SHA1,这个算法提供了更高的计算量, 同时还有具有良好的伸缩性。

如果使用 crypt() 函数来进行密码验证, 那么你需要选择一种耗时恒定的字符串比较算法来避免时序攻击。 (译注:就是说,字符串比较所消耗的时间恒定, 不随输入数据的多少变化而变化) PHP 中的 == 和 === 操作符strcmp() 函数都不是耗时恒定的字符串比较, 但是 password_verify() 可以帮你完成这项工作。 我们鼓励你尽可能的使用 原生密码散列 API

“盐”是什么?

加解密领域中的“盐”是指在进行散列处理的过程中 加入的一些数据,用来避免从已计算的散列值表 (被称作“彩虹表”)中 对比输出数据从而获取明文密码的风险。

简单而言,“盐”就是为了提高散列值被破解的难度 而加入的少量数据。 现在有很多在线服务都能够提供 计算后的散列值以及其对应的原始输入的清单, 并且数据量极其庞大。 通过加“盐”就可以避免直接从清单中查找到对应明文的风险。

如果不提供“盐”,password_hash() 函数会随机生成“盐”。 非常简单,行之有效。

我应该如何保存“盐”?

当使用 password_hash() 或者 crypt() 函数时, “盐”会被作为生成的散列值的一部分返回。 你可以直接把完整的返回值存储到数据库中, 因为这个返回值中已经包含了足够的信息, 可以直接用在 password_verify()crypt() 函数来进行密码验证。

下图展示了 crypt()password_hash() 函数返回值的结构。 如你所见,算法的信息以及“盐”都已经包含在返回值中, 在后续的密码验证中将会用到这些信息。

crypt-text-rendered

 

Elasticsearch 节点类型介绍

摘要
在Elasticsearch中节点可以分为主(master)节点,数据(data)节点,客户端节点和部落节点,每种类型的节点有不同的使用方法,对于一个大的集群中,合理的配置这些属性,对集群的健壮性和性能有很大的帮助。
节点类型
当我们启动Elasticsearch的实例,就会启动至少一个节点。相同集群名的多个节点的连接就组成了一个集群,在默认情况下,集群中的每个节点都可以处理http请求和集群节点间的数据传输,集群中所有的节点都知道集群中其他所有的节点,可以将客户端请求转发到适当的节点。节点有以下类型:
  • 主(master)节点:在一个节点上当node.master设置为True(默认)的时候,它有资格被选作为主节点,控制整个集群。
  • 数据(data)节点:在一个节点上node.data设置为True(默认)的时候。该节点保存数据和执行数据相关的操作,如增删改查,搜索,和聚合。
  • 客户端节点:当一个节点的node.master和node.data都设置为false的时候,它既不能保持数据也不能成为主节点,该节点可以作为客户端节点,可以响应用户的情况,并把相关操作发送到其他节点。
  • 部落节点: 当一个节点配置tribe.*的时候,它是一个特殊的客户端,它可以连接多个集群,在所有连接的集群上执行搜索和其他操作。
默认情况下,节点配置是一个主节点和一个数据节点。这是非常方便的小集群,但随着集群的发展,分离主节点和数据节点将变得很重要。

Tcpdump notes

tcpdump 是一个运行在命令行下的嗅探工具。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。tcpdump 是一个在BSD许可证下发布[2]自由软件

tcpdump 适用于大多数的类Unix系统 操作系统:包括LinuxSolarisBSDMac OS XHP-UXAIX 等等。在这些系统中,tcpdump 需要使用libpcap这个捕捉数据的。其在Windows下的版本称为WinDump;它需要WinPcap驱动,相当于在Linux平台下的libpcap.

用途

tcpdump能够分析网络行为,性能和应用产生或接收网络流量。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息,从而使用户能够进一步找出问题的根源。

也可以使用 tcpdump 的实现特定目的,例如在路由器网关之间拦截并显示其他用户或计算机通信。通过 tcpdump 分析非加密的流量,如TelnetHTTP的数据包,查看登录的用户名、密码、网址、正在浏览的网站内容,或任何其他信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。[3]

MySQL 特性分析 InnoDB transaction history

背景

在写压力负载比较重的MySQL实例上,InnoDB可能积累了较长的没有被purge掉的transaction history,导致实例性能的衰减,或者空闲空间被耗尽,下面就来看看它是怎么产生的,或者有没有什么方法来减轻,避免这样的问题出现。

InnoDB purge 概要

InnoDB是一个事务引擎,实现了MVCC特性,也就是在存储引擎里对行数据保存了多个版本。在对行数据进行delete或者update更改时,行数据的前映像会保留一段时间,直到可以被删除的时候。

在大部分OLTP负载情况下,前映像会在数据操作完成后的数秒钟内被删除掉,但在一些情况下,假设存在一些持续很长时间的事务需要看到数据的前映像,那么老版本的数据就会被保留相当长一段时间。

虽然MySQL 5.6版本增加了多个purge threads来加快完成老版本数据的清理工作,但在write-intensive workload情况下,不一定完全凑效。

date(): It is not safe to rely on the system's timezone settings

date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. PHP 5.3 +  需要在 php.ini 文件中配置 timezone, 或在调用 date() 函数之前使用 date_default_timezone_set() 方法设置 timezone

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future

昨天刚把 php 的错误日志打开,今天看自己以前写的 监控网站访问量的 demo 就一片空白了 一片空白了 一片空白了。
手动执行了下 数据采集的 data_access.php 发现有一个警告信息输出:
Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead
这个警告把原本的数据结构给打乱了,所以会出现 demo 的空白。
从提示很明显可以看出  mysql 扩展模块将在将来弃用,可以使用 mysqli 和 PDO 来代替。

Case A:
将 mysql 替换为 mysqli

-$conn = mysql_connect("db-hostname","dnuser","password","dbname");
+$conn = mysqli_connect("db-hostname","dbuer","password","dbname");
 
-if (!$conn) {
-  die('Could not connect: ' . mysql_error());
+/* check connection */
+if (mysqli_connect_errno()) {
+    printf("Connect failed: %s\n", mysqli_connect_error());
+    exit();
 }

官方文档  http://www.php.net/manual/zh/mysqli.query.php

Case B:
将错误日志关闭
display_errors = On
改为
display_errors = Off

Case C:
在php程序代码里面设置报警级别
error_reporting(E_ALL ^ E_DEPRECATED);

这样 Deprecated 这个问题就解决了。 不过还是推荐 使用 mysqli 或是 PDO 替代老旧的 mysql. 毕竟是趋势嘛。

 

pip_faq - Cannot fetch index base URL

新装了一个 ubuntu, 由于公司内诸多网络限制,未经认证的用户是禁止下载任何东西的。 自己就用 cntlm 搭了一个透明代理供自己科学上网。 hah cntlm 配置我这里就不做过多介绍了,请自行脑补。 配置全局代理
^_^[17:20:51][[email protected] ~]$tail -2  .profile
export http_proxy=http://X.X.X.X:PORT
export https_proxy=http://X.X.X.X:PORT
安装 paramiko
^_^[17:09:33][[email protected] ~]$sudo pip install paramiko
Downloading/unpacking paramiko
  Cannot fetch index base URL https://pypi.python.org/simple/
  Could not find any downloads that satisfy the requirement Flask
Cleaning up...
No distributions at all found for Flask
Storing debug log for failure in /home/lucy/.pip/pip.log
Woops, 不能用 Google 了一把 做了这么一些操作,能用了 喜出望外。 什么鬼? 和缓存有关? 和代理有关?看起来是和sudo 权限有关。
@[email protected][17:18:20][[email protected] ~]$rm -r ~/.pip/
^_^[17:18:26][[email protected] ~]$sudo -E pip install paramiko
Downloading/unpacking paramiko
  Downloading paramiko-1.16.0-py2.py3-none-any.whl (169kB): 169kB downloaded
Downloading/unpacking pycrypto>=2.1,!=2.4 (from paramiko)
  Downloading pycrypto-2.6.1.tar.gz (446kB): 446kB downloaded
  Running setup.py (path:/tmp/pip_build_root/pycrypto/setup.py) egg_info for package pycrypto
    
Downloading/unpacking ecdsa>=0.11 (from paramiko)
  Downloading ecdsa-0.13-py2.py3-none-any.whl (86kB): 86kB downloaded
  ... ...
顺便来说一下 sudo
用户也可以通过su切换到root用户运行命令。然而与su的启动一个root shell允许用户运行之后的所有的命令不同,sudo可以针对单个命令授予临时权限。sudo仅在需要时授予用户权限,减少了用户因为错误执行命令损坏系统的可能性。sudo也可以用来以其他用户身份执行命令。此外,sudo可以记录用户执行的命令,以及失败的特权获取。

选项:
  -a type       使用指定的 BSD 认证类型
  -b            在后台运行命令
  -C fd         关闭所有 >= fd 的文件描述符
  -E            在执行命令时保留用户环境
  -e            编辑文件而非执行命令
  -g group      以指定的用户组执行命令
  -H            将 HOME 变量设为目标用户的主目录。
  -h            显示帮助消息并退出
  -i [command]  以目标用户身份运行一个登录 shell
  -K            完全移除时间戳文件
  -k            无效的时间戳文件
  -l[l] command 列出用户能执行的命令
  -n            非交互模式,将不提示用户
  -P            保留组向量,而非设置为目标的组向量
  -p prompt     使用指定的密码提示
  -S            从标准输入读取密码
  -s [command]  以目标用户身份运行 shell
  -U user       在列表时,列出指定用户的权限
  -u user       以指定用户身份运行命令(或编辑文件)
  -V            显示版本信息并退出
  -v            更新用户的时间戳而不执行命令
  --            停止处理命令行参数