下载安装VirtualBox和Vagrant

要使用Vagrant需要先安装依赖支持的VirtualBox。下一步,下一步默认安装完成2个软件。

下载安装 VirtualBox 官网:https://www.virtualbox.org/

下载安装 Vagrant 官网:http://www.vagrantup.com/

 

配置使用Vagrant 安装 kali linux

http://www.vagrantbox.es/ 这里提供了超全的linux系统预制box包。已经给你搞好系统了,任君选取所需,我这里选kali linux

先用迅雷把http://ftp.sliim-projects.eu/boxes/kali-linux-1.0-amd64.box

下载好,放入你的工作目录如D:\Vagrant

增加box

vagrant  box add base kali-linux-1.0-amd64.box

初始化

vagrant init

 

D:\Vagrant>vagrant  box add base kali-linux-1.0-amd64.box
==> box: Adding box ‘base’ (v0) for provider:
    box: Downloading: file://D:/Vagrant/kali-linux-1.0-amd64.box
    box: Progress: 100% (Rate: 65.2M/s, Estimated time remaining: –:–:–)
==> box: Successfully added box ‘base’ (v0) for ‘virtualbox’!

D:\Vagrant>vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Vagrantfile配置

打开目下的Vagrantfile配置文件

网络配置

Vagrant的网络有三种模式

1、端口映射方式,映射虚拟机中端口到宿主机

config.vm.network :forwarded_port, guest: 80, host: 8080

guest: 80 表示虚拟机中的80端口, host: 8080 表示映射到宿主机的8080端口。

2、私有网络

config.vm.network :private_network, ip: "192.168.1.104"

192.168.1.104 表示虚拟机的IP,多台虚拟机的话需要互相访问的话,设置在相同网段即可

3、桥接

config.vm.network :public_network

这样一个广播域的dhcp就可以分配ip了

目录映射

默认情况下,当前的工作目录,会被映射到虚拟机的 /vagrant 目录,当前目录下的文件可以直接在 /vagrant 下进行访问

也可以自己根据需要映射下

config.vm.synced_folder "work1/", "/data1"

前面的参数 “work1/”  表示的是本地的路径,这里使用对于工作目录的相对路径,这里也可以使用绝对路径,比如: “D:\Vagrant\work1”

启动

set VBOX_INSTALL_PATH=%VBOX_MSI_INSTALL_PATH%

vagrant up –provider=virtualbox

常用管理命令

vagrant up (启动虚拟机)
vagrant halt (关闭虚拟机——对应就是关机)
vagrant suspend (暂停虚拟机——只是暂停,虚拟机内存等信息将以状态文件的方式保存在本地,可以执行恢复操作后继续使用)
vagrant resume (恢复虚拟机 —— 与前面的暂停相对应)
vagrant destroy (删除虚拟机,删除后在当前虚拟机所做进行的除开Vagrantfile中的配置都不会保留)

参考来源

使用Vagrant在Windows下部署开发环境

1、google authenticator(谷歌身份验证器) 介绍

google authenticator(谷歌身份验证器) 是谷歌推出的基于时间的一次一密算法,也就是Time-based One-time Password (TOTP)

@峰云 的介绍  使用google authenticator打造运维平台的动态口令

 

2、google authenticator php 服务端

使用php类

直接下载 https://github.com/PHPGangsta/GoogleAuthenticator/raw/master/PHPGangsta/GoogleAuthenticator.php

在自己的业务逻辑中引用此php类.

require_once '../PHPGangsta/GoogleAuthenticator.php';

$ga = new PHPGangsta_GoogleAuthenticator();

//创建一个新的"安全密匙SecretKey"
//把本次的"安全密匙SecretKey" 入库,和账户关系绑定,客户端也是绑定这同一个"安全密匙SecretKey"
$secret = $ga->createSecret();
echo "安全密匙SecretKey: ".$secret."\n\n";

$qrCodeUrl = $ga->getQRCodeGoogleUrl('www.iamle.com', $secret); //第一个参数是"标识",第二个参数为"安全密匙SecretKey" 生成二维码信息
echo "Google Charts URL for the QR-Code: ".$qrCodeUrl."\n\n"; //Google Charts接口 生成的二维码图片,方便手机端扫描绑定安全密匙SecretKey

$oneCode = $ga->getCode($secret); //服务端计算"一次性验证码"
echo "服务端计算的验证码是:".$oneCode."\n\n";

//把提交的验证码和服务端上生成的验证码做对比
// $secret 服务端的 "安全密匙SecretKey"
// $oneCode 手机上看到的 "一次性验证码"
// 最后一个参数 为容差时间,这里是2 那么就是 2* 30 sec 一分钟.
// 这里改成自己的业务逻辑
$checkResult = $ga->verifyCode($secret, $oneCode, 2);
if ($checkResult) {
    echo '匹配! OK';
} else {
    echo '不匹配! FAILED';
}

服务端例子:

安全密匙SecretKey: NI5RHMWOTBIY6KP4

Google Charts URL for the QR-Code: https://chart.googleapis.com/chart?chs=200×200&chld=M|0&cht=qr&chl=otpauth%3A%2F%2Ftotp%2Fwwek–www.iamle.com%3Fsecret%3DNI5RHMWOTBIY6KP4

 

服务端计算的验证码是:255466

匹配! OK

3、google authenticator 手机客户端

手机端安装

1、Android移动设备

在您手机的应用市场搜索“Google身份验证器”或“Google Authenticator”,下载安装即可。拥有Google身份验证器的市场有:Google Play应用汇安卓市场百度移动应用优亿市场安智市场 等

2、iOS移动设备

进入应用市场,搜索“Google Authenticator”,下载安装即可。

3、其他平台:

 

iPhone端测试上面的例子

手机中的验证码 和 服务端的验证码 都是 255466 验证通过

google authenticator iPhone

 

1、aide介绍

AIDE(Adevanced Intrusion Detection Environment,高级入侵检测环境)是个入侵检测工具,主要用途是检查文本的完整性。

AIDE能够构造一个指定文档的数据库,他使用aide.conf作为其配置文档。AIDE数据库能够保存文档的各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组(group)、文档大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小连同连接数。AIDE还能够使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每个文档的校验码或散列号。

常见的入侵检测软件: tripwire–操作比较复杂,aide–用以代替tripwire,比较简单.

2、aide安装 配置使用

#yum rpm二进制安装

yum -y install aide

我的配置文件
mv /etc/aide.conf /etc/aide.conf.bak
vim /etc/aide.conf

# Example configuration file for AIDE.

@@define DBDIR /var/lib/aide #基准数据库目录
@@define LOGDIR /var/log/aide #日志目录

# The location of the database to be read.
database=file:@@{DBDIR}/aide.db.gz #基础数据库文件

# The location of the database to be written.
#database_out=sql:host:port:database:login_name:passwd:table
#database_out=file:aide.db.new
database_out=file:@@{DBDIR}/aide.db.new.gz #更新数据库文件

# Whether to gzip the output to database
gzip_dbout=yes

# Default.
verbose=5

report_url=file:@@{LOGDIR}/aide.log
report_url=stdout
#report_url=stderr
#NOT IMPLEMENTED report_url=mailto:root@foo.com
#NOT IMPLEMENTED report_url=syslog:LOG_AUTH

# These are the default rules.
#
#p:      permissions
#i:      inode:
#n:      number of links
#u:      user
#g:      group
#s:      size
#b:      block count
#m:      mtime
#a:      atime
#c:      ctime
#S:      check for growing size
#acl:           Access Control Lists
#selinux        SELinux security context
#xattrs:        Extended file attributes
#md5:    md5 checksum
#sha1:   sha1 checksum
#sha256:        sha256 checksum
#sha512:        sha512 checksum
#rmd160: rmd160 checksum
#tiger:  tiger checksum

#haval:  haval checksum (MHASH only)
#gost:   gost checksum (MHASH only)
#crc32:  crc32 checksum (MHASH only)
#whirlpool:     whirlpool checksum (MHASH only)

#R:             p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5
#L:             p+i+n+u+g+acl+selinux+xattrs
#E:             Empty group
#>:             Growing logfile p+u+g+i+n+S+acl+selinux+xattrs
R = p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5
L = p+i+n+u+g+acl+selinux+xattrs
> = p+u+g+i+n+S+acl+selinux+xattrs


# You can create custom rules like this.
# With MHASH...
# ALLXTRAHASHES = sha1+rmd160+sha256+sha512+whirlpool+tiger+haval+gost+crc32
ALLXTRAHASHES = sha1+rmd160+sha256+sha512+tiger
# Everything but access time (Ie. all changes)
EVERYTHING = R+ALLXTRAHASHES

# Sane, with multiple hashes
# NORMAL = R+rmd160+sha256+whirlpool
NORMAL = R+rmd160+sha256

# For directories, don't bother doing hashes
DIR = p+i+n+u+g+acl+selinux+xattrs

# Access control only
PERMS = p+i+u+g+acl+selinux

# Logfile are special, in that they often change
LOG = >

# Just do md5 and sha256 hashes
LSPP = R+sha256

# Some files get updated automatically, so the inode/ctime/mtime change
# but we want to know when the data inside them changes
DATAONLY =  p+n+u+g+s+acl+selinux+xattrs+md5+sha256+rmd160+tiger

# Next decide what directories/files you want in the database.

/boot   NORMAL
/bin    NORMAL
/sbin   NORMAL
/lib    NORMAL
/lib64  NORMAL
/opt    NORMAL
/usr    NORMAL
/root   NORMAL
# These are too volatile
!/usr/src
!/usr/tmp
!/usr/share #通过文件路径前面加感叹号 ! 排除这个路径的监控,请自定义
# Check only permissions, inode, user and group for /etc, but
# cover some important files closely.
/etc    PERMS
!/etc/mtab
# Ignore backup files
!/etc/.*~
/etc/exports  NORMAL
/etc/fstab    NORMAL
/etc/passwd   NORMAL
/etc/group    NORMAL
/etc/gshadow  NORMAL
/etc/shadow   NORMAL
/etc/security/opasswd   NORMAL

/etc/hosts.allow   NORMAL
/etc/hosts.deny    NORMAL

/etc/sudoers NORMAL
/etc/skel NORMAL

/etc/logrotate.d NORMAL

/etc/resolv.conf DATAONLY

/etc/nscd.conf NORMAL
/etc/securetty NORMAL

# Shell/X starting files
/etc/profile NORMAL
/etc/bashrc NORMAL
/etc/bash_completion.d/ NORMAL
/etc/login.defs NORMAL
/etc/zprofile NORMAL
/etc/zshrc NORMAL
/etc/zlogin NORMAL
/etc/zlogout NORMAL
/etc/profile.d/ NORMAL
/etc/X11/ NORMAL

# Pkg manager
/etc/yum.conf NORMAL
/etc/yumex.conf NORMAL
/etc/yumex.profiles.conf NORMAL
/etc/yum/ NORMAL
/etc/yum.repos.d/ NORMAL

/var/log   LOG
/var/run/utmp LOG

# This gets new/removes-old filenames daily
!/var/log/sa
# As we are checking it, we've truncated yesterdays size to zero.
!/var/log/aide.log

# LSPP rules...
# AIDE produces an audit record, so this becomes perpetual motion.
# /var/log/audit/ LSPP
/etc/audit/ LSPP
/etc/libaudit.conf LSPP
/usr/sbin/stunnel LSPP
/var/spool/at LSPP
/etc/at.allow LSPP
/etc/at.deny LSPP
/etc/cron.allow LSPP
/etc/cron.deny LSPP
/etc/cron.d/ LSPP
/etc/cron.daily/ LSPP
/etc/cron.hourly/ LSPP
/etc/cron.monthly/ LSPP
/etc/cron.weekly/ LSPP
/etc/crontab LSPP
/var/spool/cron/root LSPP

/etc/login.defs LSPP
/etc/securetty LSPP
/var/log/faillog LSPP
/var/log/lastlog LSPP

/etc/hosts LSPP
/etc/sysconfig LSPP

/etc/inittab LSPP
/etc/grub/ LSPP
/etc/rc.d LSPP

/etc/ld.so.conf LSPP

/etc/localtime LSPP

/etc/sysctl.conf LSPP

/etc/modprobe.conf LSPP

/etc/pam.d LSPP
/etc/security LSPP
/etc/aliases LSPP
/etc/postfix LSPP

/etc/ssh/sshd_config LSPP
/etc/ssh/ssh_config LSPP

/etc/stunnel LSPP

/etc/vsftpd.ftpusers LSPP
/etc/vsftpd LSPP

/etc/issue LSPP
/etc/issue.net LSPP

/etc/cups LSPP

# With AIDE's default verbosity level of 5, these would give lots of
# warnings upon tree traversal. It might change with future version.
#
#=/lost\+found    DIR
#=/home           DIR

# Ditto /var/log/sa reason...
!/var/log/and-httpd

# Admins dot files constantly change, just check perms
/root/\..* PERMS
#初始化监控数据库(这需要一些时间)
/usr/sbin/aide -c /etc/aide.conf --init
 
#把当前初始化的数据库作为开始的基础数据库
cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
 
#如果是正常的改动 更新改动到基础数据库
aide --update
cd /var/lib/aide/
#覆盖替换旧的数据库
mv aide.db.new.gz aide.db.gz
 
#在终端中查看检测结果
aide --check
 
#检查文件改动 保存到文件
aide --check --report=file:/tmp/aide-report-`date +%Y%m%d`.txt
 
#定时任务执行aide检测报告和自动邮件发送aide检测报告(如果没有mail, yum install mail,还需要有本地邮件服务支持, yum install sendmail;/etc/init.d/sendmail start)
crontab -e
00 02 * * * /usr/sbin/aide -C -V4 | /bin/mail -s "AIDE REPORT $(date +%Y%m%d)"  root@localhost

 

-C参数和 –check是一个意思
-V 报告的详细程度可以通过-V选项来调控,级别为0-255, -V0 最简略,-V255 最详细。
[root@dev ~]# aide –help
Aide 0.14
Usage: aide [options] command
Commands:
  -i, –initInitialize the database
  -C, –checkCheck the database
  -u, –updateCheck and update the database non-interactively
      –compareCompare two databases
Miscellaneous:
  -D, –config-checkTest the configuration file
  -v, –versionShow version of AIDE and compilation options
  -h, –helpShow this help message
Options:
  -c [cfgfile]–config=[cfgfile]Get config options from [cfgfile]
  -B “OPTION”–before=”OPTION”Before configuration file is read define OPTION
  -A “OPTION”–after=”OPTION”After configuration file is read define OPTION
  -r [reporter]–report=[reporter]Write report output to [reporter] url
  -V[level]–verbose=[level]Set debug message level to [level]

4、使用中遇到的问题 错误

执行 /usr/sbin/aide -c /etc/aide.conf –init 或者 aide -i 后报错

lgetfilecon_raw failed for /var/log/yum.log:No data available
lgetfilecon_raw failed for /var/log/messages.2:No data available
lgetfilecon_raw failed for /var/log/cron:No data available
lgetfilecon_raw failed for /var/log/messages.3:No data available
lgetfilecon_raw failed for /var/log/messages.1:No data available
lgetfilecon_raw failed for /var/log/sdsvrd.log:No data available
lgetfilecon_raw failed for /var/log/spooler.3:No data available
lgetfilecon_raw failed for /var/log/cron.3:No data available
lgetfilecon_raw failed for /var/log/cron.1:No data available
lgetfilecon_raw failed for /var/log/sdupdate.log:No data available
lgetfilecon_raw failed for /var/log/rsyncd.log:No data available
lgetfilecon_raw failed for /var/log/maillog.3:No data available
lgetfilecon_raw failed for /var/log/rpmpkgs.3:No data available
lgetfilecon_raw failed for /var/log/pm/suspend.log:No data available
lgetfilecon_raw failed for /var/log/prelink/prelink.log:No data available

以下配置项改为如下.

#/etc/aide.conf
ALLXTRAHASHES = sha1+rmd160+sha256+sha512+tiger
EVERYTHING = p+i+n+u+g+s+m+c+acl+xattrs+md5+ALLXTRAHASHES
NORMAL = p+i+n+u+g+s+m+c+acl+xattrs+md5+rmd160+sha256
DIR = p+i+n+u+g+acl+xattrs
PERMS = p+i+u+g+acl
LOG = p+u+g+i+n+S+acl+xattrs
LSPP = p+i+n+u+g+s+m+c+acl+xattrs+md5+sha256
DATAONLY = p+n+u+g+s+acl+xattrs+md5+sha256+rmd160+tiger

参考来源:How to Fix Aide “lgetfilecon_raw failed for / : No data available” errors

5、参考

AIDE –Linux高级入侵检测 http://gupt12.blog.51cto.com/7651206/1263183

#在国内镜像下载二进制包
wget -c  http://www.golangtc.com/static/go/go1.4.1.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.4.1.linux-amd64.tar.gz

#把golang的bin目录加入全局环境变量
cat >>/etc/profile<<EOF
export PATH=$PATH:/usr/local/go/bin
EOF
#让配置生效
source /etc/profile
#检查下是否成功
go version

#在当前用户目录下新建go目录作为项目目录
mkdir -p $HOME/go
#用cat的方法在尾部增加配置配置golang的 GOROOT GOPATH
cat >>$HOME/.bash_profile<<EOF
export GOROOT=/usr/local/go
export GOPATH=\$HOME/go
export PATH=\$PATH:\$GOROOT/bin
EOF
#让配置生效
source $HOME/.bash_profile

#检查下go的env环境变量
go env

1、SDR是什么

字面意思,软件定义无线电。具体的可以在搜索引擎上看到。如果让我来简单的表述下那么就是。

SDR就是“电脑控制设置芯片参数,检波。”

 

2、RTL2832U+R820T电视棒是什么

USB DVB-T & RTL-SDR Realtek RTL2832U & R820T  这是螃蟹( Realtek)的一个芯片型号,原本是做电视棒芯片的。

后来被人发现这个芯片具有非常广的频率接收范围,然后就被用来做sdr应用了,rtl的sdr应用。

在这里看到一个表 https://gathering.tweakers.net/forum/list_messages/1524421/2

Tuner    Frequency range
Elonics E4000    52 - 2200 MHz with a gap from 1100 MHz to 1250 MHz (varies)
Rafael Micro R820T    24 - 1766 MHz
Fitipower FC0013    22 - 1100 MHz (FC0013B/C, FC0013G has a separate L-band input, which is unconnected on most sticks)
Fitipower FC0012    22 - 948.6 MHz
FCI FC2580    146 - 308 MHz and 438 - 924 MHz (gap in between)

那么RTL2832U+R820T接收的频率范围为 24 – 1766 MHz 非常给力啊。

 

3、驱动安装(第一步必须)

3.1、RTL2832U+R820T在windows上玩SDR驱动安装

玩sdr必须先通过这样的方式安装驱动支持,电视棒送的那个套件和驱动就不要管了!

高于等于Windows vista如 ,windwos 7、windows8.x使用

http://zadig.akeo.ie/downloads/zadig_2.1.0.exe

Windows XP 使用

http://zadig.akeo.ie/downloads/zadig_xp_2.1.0.exe

运行zadig>点击 Options > 勾选 List All Devices

img20140502001

Options》 List All Devices 勾选,就能看到所有设备了

选择RTL2832U > 点击 install Driver 即可,其他参数不要改动,我这里应为安装过了,所以是Reinstall Driver。

img20140502002

选择RTL2832U ,参数不用管,直接点 Install Device

 

驱动安装ok!

 

4、SDR软件

sdr的软件有很多款,如sdr#(sdrsharp)、WRplus、 HDSDR、SDR-RADIO-Pro_v2

我这里只推荐使用SDR-RADIO-Pro_v2,反正我喜欢这款,功能和界面最强。

4.1、SDR-RADIO-Pro_v2

http://v2.sdr-radio.com/Download.aspx下载。

2014年5月2日下载到的2.2最新版本为SDR-RADIO-Pro_v2.2b1735.exe,直接下一步下一步安装好。

安装好后桌面会出来三个图标,SDRConsole (V2)、SDRServer (V2)、SDR Data File Analyser。

SDR-RADIO-Pro_v2使用RTL2832U+R820T有2种方式,1、rtl-tcp搭桥方式和2、RTL扩展驱动直连,都需要三方扩展支持。

4.1.1、方法1使用rtl-tcp搭桥模式连接RTL2832U+R820T

下载rtl-sdr-release RelWithDebInfo.zip http://pan.baidu.com/s/11W6J0

运行rtl_tcp.exe 出现如下信息就表示ok。

img201405021

rtl_tcp

打开 SDRConsole (V2) 然后看图操作吧

SDR-RADIO-Pro_v2的使用慢慢琢磨吧。

4.1.2、方法2、RTL扩展驱动直连RTL2832U+R820T

下载 SDR-Radio.com.RTLUSB-20130209.zip

解压得到三个文件 libusb-1.0.dll 、rtlsdr.dll 、SDRSourceRTL2832U.dll。只需要复制rtlsdr.dll 、SDRSourceRTL2832U.dll这2个到

SDR-RADIO-Pro_v2的安装目录下即可。

打开 SDRConsole (V2)  后选设备和方法1相同,安装这2个dll后,下拉选择 里面除了RTL SDR (TCP)外,多了一个RTL SDR (USB) ,选他即可。

5、SDR# (SDR Sharp)

下载 http://sdrsharp.com/downloads/sdr-install.zip 解压后运行 install.bat

自动绿色安装生成目录sdrsharp 直接运行 SDRSharp.exe即可。

选择RTL-SDR / USB (注:同样支持RTL-SDR TCP 方式,方法如4.1.1), 配置参数勾选RTL AGC Tuner AGC,点击开始。

sdr# sdrsharp 使用rtl-sdr

sdr# sdrsharp 使用rtl-sdr

 

6、扩展资料

http://www.rtl-sdr.com/ rtl sdr资讯站,有大量的rtl sdr应用展示。

THE BIG LIST OF RTL-SDR SUPPORTED SOFTWARE 本篇文章介绍了好几款sdr软件配合RTL2832U+R820T使用

廉价软接收 RTL2832U+E4000/R820T 

把RTL2832改造成“专业”SDR接收棒

rtl-sdr, RTL2832电视棒追踪飞机教程(ADS-B)

 

官网的rpm二进制包是不是不够用啊!什么都编译安装是否很蛋疼,我反正是这么觉得的,没必要什么东西非要自己编译安装。

在对版本没有特殊需求,不需要改动源码的情况下,果断的yum的方式安装rpm包吧。

yum 方式安装rpm包 和 用rpm包管理器命令安装rpm包,区别是:yum 方式安装rpm包会解决包依赖关系,而rpm包管理器直接安装rpm包,不会解决包依赖关系。

 

RepoForge 源

 

CentOS7.x安装RepoForge 源

wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
yum -y install rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

 

CentOS6.x安装RepoForge 源

取自己对应的版本,我这里是centos6.x x64

yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

试试安装一个比自带的top好用的 htop “任务管理器”。

yum -y install htop

 

EPEL 源

CentOS7.x安装EPEL 源

64位系统

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-6.noarch.rpm
yum -y install epel-release-7-6.noarch.rpm
yum makecache
yum repolist
yum --enablerepo=epel info htop

 

CentOS6.x安装EPEL 源

32位系统

yum -y install https://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

64位系统

yum -y install https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

CentOS5.x安装EPEL 源

32位系统

yum -y install https://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm

64位系统

yum -y install https://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm