技术改变世界 阅读塑造人生! - shaogx.com

This string was altered by TechBlog\Plugins\Example.; This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.

资深系统管理员给Linux/Unix新人们的建议

                      资深系统管理员给Linux/Unix新人们的建议摘要:抚琴煮酒是一位现在在外企工作的linux/unix系统工程师、项目实施工程师,也曾经担任过RHCE的教学工作。根据多年的经验积累,抚琴煮酒发现很多新人对于如何入门和规划自己的Linux学习之路都处在一种迷茫的状态,因此撰写此文,帮助入门者走出学习的门槛。 【51CTO独家特稿】作者前言:本人从事windows、linux/unix系统工程师多年了,也做过相当长时间的项目实施工程师,维护和架构过大型广告网站、商业网站及证券类网站,感觉对linux/unix算是比较熟悉了,所以就这个职业的规则算是有点心得了吧。... 全文

资深系统管理员给Linux/Unix新人们的建议 Linux系统运维 Linux系统开发 Linux嵌入式开发 Linux系统管理和维护

嵌入式Linux系统软件开发学习思路详细介绍

底层软件开发人员,及所有的程序员,若想作好软件设计(良好的结构和移植性),能适应新项目的变化,就要遵循下面的原则:·最重要的是要理解基本概念 ( 如操作系统 ),掌握设计原则 ( 如接口分层 )。·第二是经验的积累。实践经验比书本知识更可贵,可极大提高后续工作和学习效率。·第三是关注新的软件技术,提高自己对软件设计的理解。需要注意的是,一个完整固定的学习路线是很难确定的,原因一是因人而异,二是技术进步很快。... 全文

嵌入式 Linux 开发

Linux操作系统下C开发环境的构成与安装

你了解Linux吗?相信现在越来越多的人会说“是”的。那么你了解到何种程度呢?不可否认,目前决大多数的Linux用户对Linux的了解还处于比较低级的层次,他们可能会几条命令、会配几种服务、会用rpm来安装软件、会操作KDE/Gnome界面等等,但是当他们遇到一些需要编译安装的软件时,面对一些简单的出错信息,他们就手足无措了。要想真正跨跃这些初级层次,你就不可能不去了解一些底层的东西,比如本文要讲到的Linux下的C开发环境以及本文之外的其它操作系统知识。... 全文

Linux C开发 C环境

linux

移植I2C-EEPROM 驱动   编者:略。   1 在内核中配置I2C 驱动           Linux-2.6.32.2 对S2C2440 的I2C 接口提供了完善的驱动,因此我们只需在内核中配置一下即可使用。           在内核源代码目录执行:make menuconfig,进入内核配置主菜单,依次选择进入如下子菜单:           Device Drivers --->               <*> I2C support --->               I2C Hardware Bus support --->  如图,我们看到这里已经选择好了“<*> S3C2410 I2C Driver”,这里的S3C2410 也可以适用于S3C2440,因为它们的I2C 端口及寄存器定义都是完全相同的。   以上配置所对应的驱动源代码为:linux-2.6.32.2/drivers/i2c/busses/i2c-s3c2410.c       2 测试I2C-EEPROM         Mini2440 为了方便用户测试,基于I2C 总线挂接了一个EEPROM 芯片,它是AT24C08,通过写入和读取该芯片,我们就可以测试I2C 总线驱动了。在内核根目录下执行:make zImage,把生成的新内核烧写到开发板中,依然使用友善之臂提供的root_qtopoia,因为里面已经包含了I2C-EEPROM测试程序   在命令行种输入:i2c –w 可以向板子的24C08 器件中写入数据(0x00-0xff)... 全文

Linux 内核 linux内核 驱动开发 嵌入式系统

开发Linux系统下的磁盘加密方法详解(1)

随着智能手机的计算能力和存储能力的提高,手机中将会存放越来越多的私有数据,这些数据的泄密可能造成严重后果。手机信息安全一直是我们的重点之一,对于一些重要的功能我们要求鉴权后才能使用,但这只能挡住初级的黑客,只能防君子不能防小人,所以我们希望把重要的数据进行加密后再保存。为此,今天花了一点时间去了解Linux 磁盘加密的方法。方法一: 下载并编译util-linux http://www.paranoiacs.org/~sluskyb/hacks/util-linux/losetup-combined.patch http://ftp.cwi.nl/aeb/util-linux/util-linux-2.12.tar.gz http://hydra.azilian.net/util-linux-2.12-kernel-2.6.patch tar zxvf util-linux-2.12.tar.gz cd util-linux-2.12 patch -p1 < ../losetup-combined.patch patch -p1 < ../util-linux-2.12-kernel-2.6.patch (如果有_syscall5之类编译错误,将它换成新的调用方式syscall) make;make install 编译内核(已经支持cryptoloop则跳过此步) make menuconfig Device Drivers >Block Devices>Loopback device support BLK_DEV_CRYPTOLOOP 加载模块 modprobe cryptoloop (以及加密模块) 创建loop设备 dd if=/dev/zero of=~/cryptoloop.image bs=1M count=10 losetup -e aes-256 /dev/loop0 ~/cryptoloop.image (提示输入密码) 创建文件系统并加载 mkfs.ext3 /dev/loop0 mkdir /mnt/crypto mount -t ext3 ~/cryptoloop.image /mnt/crypto/ -oencryption=aes-256 (提示输入密码) 卸载 umount /mnt/crypto losetup -d /dev/loop0 重新加载 losetup -e aes-256 /dev/loop0 ~/cryptoloop.image mount -t ext3 ~/cryptoloop.image /mnt/crypto/ -oencryption=aes-256 cryptoloop就是一种transfer的实现。至于使用哪种transfer及transfer的参数(如密码),这可以通过LOOP_SET_STATUS64的ioctrl系统调用来完成(mount命令就是这样实现的)。cryptoloop的缺点是只能针对loop设备,而且对日志型文件系统无效。1 23下一页>>内容导航给力(0票)动心(0票)废话(0票)专业(0票)标题党(0票)路过(0票) getcountscom(47834,11); getcountscom(47834,12); getcountscom(47834,13); getcountscom(47834,14); getcountscom(47834,15); getcountscom(47834,16); ... 全文

开发 磁盘加密 方法 Linux

用Red Hat Enterprise Linux 搭建Java开发环境

其实用Red Hat Enterprise Linux搭建Java开发环境也并不困难,在下列出几个步骤,供参考: 1、挂载光盘[root@station25 ~]# mount /dev/cdrom /media/ mount: block device /dev/cdrom is write-protected, mounting read-only 2、配置yum源,并验证[rhel-debuginfo] name=Red Hat  baseurl=file:///media/Server enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release [root@station25 ~]# yum update Loaded plugins: rhnplugin, security This system is not registered with RHN. RHN support will be disabled. rhel-debuginfo | 1.3 kB 00:00 rhel-debuginfo/primary | 732 kB 00:00 rhel-debuginfo 2292/2292 Skipping security plugin, no data Setting up Update Process No Packages marked for Update3、安装IDE其实也主要就是这几个东西(当然还有一些依赖包啥的,总共133M)java-1.6.0-openjdk.i386                 1:1.6.0.0-1.2.b09.el5     rhel-debuginfo java-1.6.0-openjdk-demo.i386            1:1.6.0.0-1.2.b09.el5     rhel-debuginfo java-1.6.0-openjdk-devel.i386           1:1.6.0.0-1.2.b09.el5     rhel-debuginfo java-1.6.0-openjdk-javadoc.i386         1:1.6.0.0-1.2.b09.el5     rhel-debuginfo java-1.6.0-openjdk-src.i386             1:1.6.0.0-1.2.b09.el5     rhel-debuginfo 然后安装  [root@station25 ~]# yum install java-* -y Loaded plugins: rhnplugin, security This system is not registered with RHN. RHN support will be disabled. Setting up Install Process Package java-1.4.2-gcj-compat-1.4.2.0-40jpp.115.i386 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package java-1.4.2-gcj-compat-devel.i386 0:1.4.2.0-40jpp.115 set to be updated rhel-debuginfo/filelists                                                                 | 2.3 MB     00:00      --> Processing Dependency: libgcj-devel >= 4.0.0-0.42 for package: java-1.4.2-gcj-compat-devel --> Processing Dependency: gcc-java >= 4.0.0-0.42 for package: java-1.4.2-gcj-compat-devel --> Processing Dependency: libgcj-devel >= 4.0.0-0.42 for package: java-1.4.2-gcj-compat-devel --> Processing Dependency: gcc-java >= 4.0.0-0.42 for package: java-1.4.2-gcj-compat-devel --> Processing Dependency: eclipse-ecj for package: java-1.4.2-gcj-compat-devel --> Processing Dependency: /usr/lib/gcc/i386-redhat-linux/4.1.1/libgcj.spec for package: java-1.4.2-gcj-compat-devel --> Processing Dependency: /usr/lib/gcc/i386-redhat-linux/4.1.1/libgcj.spec for package: java-1.4.2-gcj-compat-devel ---> Package java-1.4.2-gcj-compat-javadoc.i386 0:1.4.2.0-40jpp.115 set to be updated ---> Package java-1.4.2-gcj-compat-src.i386 0:1.4.2.0-40jpp.115 set to be updated --> Processing Dependency: libgcj-src >= 4.0.0-0.42 for package: java-1.4.2-gcj-compat-src --> Processing Dependency: libgcj-src >= 4.0.0-0.42 for package: java-1.4.2-gcj-compat-src ---> Package java-1.6.0-openjdk.i386 1:1.6.0.0-1.2.b09.el5 set to be updated ---> Package java-1.6.0-openjdk-demo.i386 1:1.6.0.0-1.2.b09.el5 set to be updated ---> Package java-1.6.0-openjdk-devel.i386 1:1.6.0.0-1.2.b09.el5 set to be updated ---> Package java-1.6.0-openjdk-javadoc.i386 1:1.6.0.0-1.2.b09.el5 set to be updated ---> Package java-1.6.0-openjdk-src.i386 1:1.6.0.0-1.2.b09.el5 set to be updated --> Running transaction check ---> Package eclipse-ecj.i386 1:3.2.1-19.el5 set to be updated ---> Package gcc-java.i386 0:4.1.2-46.el5 set to be updated ---> Package libgcj-devel.i386 0:4.1.2-46.el5 set to be updated ---> Package libgcj-src.i386 0:4.1.2-46.el5 set to be updated --> Finished Dependency Resolution  Dependencies Resolved  ================================================================================================================  Package                               Arch         Version                        Repository              Size ================================================================================================================ Installing:  java-1.4.2-gcj-compat-devel           i386         1.4.2.0-40jpp.115              rhel-debuginfo          50 k  java-1.4.2-gcj-compat-javadoc         i386         1.4.2.0-40jpp.115              rhel-debuginfo          24 M  java-1.4.2-gcj-compat-src             i386         1.4.2.0-40jpp.115              rhel-debuginfo          19 k  java-1.6.0-openjdk                    i386         1:1.6.0.0-1.2.b09.el5          rhel-debuginfo          28 M  java-1.6.0-openjdk-demo               i386         1:1.6.0.0-1.2.b09.el5          rhel-debuginfo         2.2 M  java-1.6.0-openjdk-devel              i386         1:1.6.0.0-1.2.b09.el5          rhel-debuginfo         9.2 M  java-1.6.0-openjdk-javadoc            i386         1:1.6.0.0-1.2.b09.el5          rhel-debuginfo          20 M  java-1.6.0-openjdk-src                i386         1:1.6.0.0-1.2.b09.el5          rhel-debuginfo          25 M Installing for dependencies:  eclipse-ecj                           i386         1:3.2.1-19.el5                 rhel-debuginfo         7.9 M  gcc-java                              i386         4.1.2-46.el5                   rhel-debuginfo         2.9 M  libgcj-devel                          i386         4.1.2-46.el5                   rhel-debuginfo         1.4 M  libgcj-src                            i386         4.1.2-46.el5                   rhel-debuginfo          11 M  Transaction Summary ================================================================================================================ Install     12 Package(s)          Update       0 Package(s)          Remove       0 Package(s)          安装的过程中一共是安装了12个包:  Running Transaction   Installing     : libgcj-devel                                                                            1/12  error: failed to stat /media/RHEL_5.4 i386 DVD: No such file or directory   Installing     : libgcj-src                                                                              2/12    Installing     : java-1.4.2-gcj-compat-javadoc                                                           3/12    Installing     : java-1.6.0-openjdk-javadoc                                                              4/12    Installing     : java-1.6.0-openjdk                                                                      5/12    Installing     : gcc-java                                                                                6/12    Installing     : eclipse-ecj                                                                             7/12    Installing     : java-1.4.2-gcj-compat-devel                                                             8/12    Installing     : java-1.6.0-openjdk-devel                                                                9/12    Installing     : java-1.6.0-openjdk-src                                                                 10/12    Installing     : java-1.4.2-gcj-compat-src                                                              11/12    Installing     : java-1.6.0-openjdk-demo                                                                12/12   安装完毕以后,输入javac验证,出现以下信息就OK了 [root@station25 ~]# javac 用法:javac <选项> <源文件> 其中,可能的选项包括:   -g                         生成所有调试信息   -g:none                    不生成任何调试信息   -g:{lines,vars,source}     只生成某些调试信息   -nowarn                    不生成任何警告   -verbose                   输出有关编译器正在执行的操作的消息   -deprecation               输出使用已过时的 API 的源位置   -classpath <路径>            指定查找用户类文件和注释处理程序的位置   -cp <路径>                   指定查找用户类文件和注释处理程序的位置   -sourcepath <路径>           指定查找输入源文件的位置   -bootclasspath <路径>        覆盖引导类文件的位置   -extdirs <目录>              覆盖安装的扩展目录的位置   -endorseddirs <目录>         覆盖签名的标准路径的位置   -proc:{none,only}          控制是否执行注释处理和/或编译。   -processor <class1>[,<class2>,<class3>...]要运行的注释处理程序的名称;绕过默认的搜索进程   -processorpath <路径>        指定查找注释处理程序的位置   -d <目录>                    指定存放生成的类文件的位置   -s <目录>                    指定存放生成的源文件的位置   -implicit:{none,class}     指定是否为隐式引用文件生成类文件    -encoding <编码>             指定源文件使用的字符编码   -source <版本>               提供与指定版本的源兼容性   -target <版本>               生成特定 VM 版本的类文件   -version                   版本信息   -help                      输出标准选项的提要   -Akey[=value]              传递给注释处理程序的选项   -X                         输出非标准选项的提要   -J<标志>                     直接将 <标志> 传递给运行时系统   用vim编辑一个GoodsList.java的文件public class GoodsList {      /**      * @param args      */     public static void main(String[] args) {         System.out.println("\t购物清单");         System.out.print("商品名称\t");         System.out.print("购买数量\t");         System.out.print("商品单价\t");         System.out.print("金额\n");          System.out.print("鳄鱼夹克\t");         System.out.print("  1\t");         System.out.print("1900\t");         System.out.print("1900\n");          System.out.print("ipodMP4\t");         System.out.print("  2\t");         System.out.print("400\t");         System.out.print("800\n");     } } 然后执行如下命令:[root@station25 ~]# javac GoodsList.java  这里就可以看到生成的.class文件了-rw-r--r-- 1 root root       771 02-16 00:45 GoodsList.class -rw-r--r-- 1 root root       568 02-16 00:45 GoodsList.java 直接用java GoodsList就可以执行了 PS:反正我是不会Java的,这个方法也是我在和一个Java高手讨论Linux的时候随手实验的。本文出自 “捷哥的IT小屋” 博客,请务必保留此出处http://wzjxzht.blog.51cto.com/4866070/1134017... 全文

linux系统 Linux RedHat Java

嵌入式linux系统开发总结(1)

1 嵌入式linux系统的结构1.1 嵌入式系统的硬件架构... 全文

嵌入式linux

详解Linux系统中QT Qtopia平台开发说明

详解Linux系统中QT Qtopia平台开发说明是本文要介绍的内容,不多说,先来看本文详细内容介绍。一、开发包的获取本例的qtopia开发包名称为:qtopia-arm.tar.gz;二、开发环境的搭建qtopia开发包运行于Linux操作系统上,Linux要求内核版本为2.4.18或以上。安装Linux操作系统,... 全文

Linux QT Qtopia

嵌入式系统开发:Arm与Linux的完美结合

嵌入式系统的定义应当是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。比如现在ATM取款机就是一个典型RTOS,embedded os主要包括两部分,一部分是处理器,比如ARM、POWERPC、MIPC,一部分是OS,比如linux,wince,vxworks,us/os,etc。... 全文

Linux Arm 嵌入式

Linux系统下的C语言开发都需要学些什么

一、工具的使用1、学会使用vim/emacs,vim/emacs是linux下最常用的源码编辑具,不光要学会用它们编辑源码,还要学会用它们进行查找、定位、替换等。新手的话推荐使用vim,这也是我目前使用的文本编辑器。2、学会makefile文件的编写规则,并结合使用工具aclocal、autoconf和automake生成makefile文件。... 全文

C语言 Linux glib

嵌入式系统开发之环境的建立

交叉编译调试环境建立在宿主机(也就是你的电脑)上,对于的开发板叫目标板。要完全手工的建立针对某特定的目标板的交叉编译环境是一个非常麻烦的过程。有些人会问,为什么需要建立特定的环境,从网上下载一个通用的不就行了?既然非常麻烦,有没有简单的方法,如果有简单的方法,是不是手工的就不要学习了?下面给大家详细介绍。 linux内核被设计成必须使用GNU的gcc来编译,而不是任何一种c编译器都可以。gcc对c进行了不要的扩展,这使得他更适合开发操作系统内核。linux内核和编译器的关系非常密切,甚至不同版本的内核需要使用不同版本的gcc编译器。比如,如果目标板采用的某一个是ARM核的处理器,则需要使用某个版本的arm-linux-gcc。 不仅是linux内核,linux应用程序编译时,也需要使用交叉gcc编译器,它依赖于宿主机的操作系统。因此,针对嵌入式平台建立交叉编译系统,通常是在pc上建立目标代码来为目标板平台的编译工具链(toolchains),它可以编译和处理linux内核及应用程序。一般来说,需要以下几个工具的源码:binutils,gcc,glibc-linuxthreads和linux内核源码等。 鉴于手工配置这些工具链很麻烦,很多嵌入式开发板的生产商都提供了建立交叉编译环境的脚本或者提供了已经配置好交叉编译环境的linux虚拟机文件,只需要运行这样一个脚本或者是使用现有的虚拟机文件就完成了整个环境的搭建。此外,通过crosstool(一个专门建立编译工具链的脚本的工具),可以在很大程序上简化工作量。 下面对这些工具链的内容及相关软件进行详细介绍: (1)binutils 一组编译开发工具,包括连接器,汇编器以及其他用于目标文件和档案的工具。 (2)gcc gcc(GNU Compiler Collection)是linux下的高级语言编译器,它不但能够支持c/c++语言的编译,而且能够支持FORTRAN,JAVA,ADA等编程语言。 (3)glibc 提供系统调用和基本函数的c库,如open,malloc,printf等。所有linux上的c程序编译时都需要与glibc库连接。如果是动态连接的程序,在运行时也需要用到它。 (4)glibc-linuxthreads POSIX(portable operating system interface,可移植操作系统接口)线程库。 (5)linux内核源码及针对某一个特定P平台的补丁包 需要根据项目的需要,选择合适的linux内核版本。另外,针对不同的cpu类型,一般存在特定的补丁程序,在进行内核编译以前,需要首先对linux内核进行打补丁的操作。 至于手动配置工具链,过程较为麻烦,需要了解的可以看我之前推荐的那本书,在132页。... 全文

嵌入式系统 交叉编译 环境 搭建 linux

Linux

PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系 统中添加新的认证手段。PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux、SunOS、HP-UX 9.0等。一、PAM的结构PAM的整个框架结构如下图所示:系统管理员通过PAM配置文件来制定认证策略,即指定什么服务该采用什么样的认证方法;应用程序开发者通过在服务程序中使用PAM API而实现对认证方法的调用;而PAM服务模块(service module)的开发者则利用PAM SPI(Service Module API)来编写认证模块(主 要是引出一些函数pam_sm_xxxx( )供libpam调用),将不同的认证机制(比如传统的UNIX认证方法、Kerberos等)加入到系统中;PAM核 心库(libpam)则读取配置文件,以此为根据将服务程序和相应的认证方法联系起来。二、PAM支持的四种管理界面:1、认证管理(authentication management)主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密信息。2、帐户管理(account management)主要是检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的限制等等。3、密码管理(password management)主要是用来修改用户的密码。4、会话管理(session management)主要是提供对会话的管理和记账(accounting)。三、PAM的文件:/usr/lib/libpam.so.* PAM核心库/etc/pam.conf或者/etc/pam.d/ PAM配置文件/usr/lib/security/pam_*.so 可动态加载的PAM service module对于RedHat,其目录不是/usr/lib,而是/lib。四、PAM的配置:PAM的配置是通过单个配置文件/etc/pam.conf。RedHat还支持另外一种配置方式,即通过配置目录/etc/pam.d/,且这种的优先级要高于单 个配置文件的方式。1、使用配置文件/etc/pam.conf该文件是由如下的行所组成的:service-name module-type control-flag module-path argumentsservice-name 服务的名字,比如telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务。module-type 模块类型有四种:auth、account、session、password,即对应PAM所支持的四种管理方式。同一个服务可以调用多个 PAM模块进行认证,这些模块构成一个stack。control-flag 用来告诉PAM库该如何处理与该服务相关的PAM模块的成功或失败情况。它有四种可能的 值:required,requisite,sufficient,optional。required 表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败结果也不会立即通知用户,而是要等到同一stack 中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必要条件。requisite 与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一stack内的任何模块,而是直 接将控制权返回给应用程序。是一个必要条件。注:这种只有RedHat支持,Solaris不支持。sufficient 表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。optional表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回值一般被忽略。对于control-flag,从Linux-PAM-0.63版本起,支持一种新的语法,具体可参看LinuxPAM文档。module-path 用来指明本模块对应的程序文件的路径名,一般采用绝对路径,如果没有给出绝对路径,默认该文件在目录/usr/lib/security下 面。arguments 是用来传递给该模块的参数。一般来说每个模块的参数都不相同,可以由该模块的开发者自己定义,但是也有以下几个共同 的参数:debug 该模块应当用syslog( )将调试信息写入到系统日志文件中。no_warn 表明该模块不应把警告信息发送给应用程序。use_first_pass 表明该模块不能提示用户输入密码,而应使用前一个模块从用户那里得到的密码。try_first_pass 表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码。expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威 胁。2、使用配置目录/etc/pam.d/(只适用于RedHat Linux)该目录下的每个文件的名字对应服务名,例如ftp服务对应文件/etc/pam.d/ftp。如果名为xxxx的服务所对应的配置文件/etc/pam.d/xxxx不存 在,则该服务将使用默认的配置文件/etc/pam.d/other。每个文件由如下格式的文本行所构成:module-type control-flag module-path arguments每个字段的含义和/etc/pam.conf中的相同。3、配置的例子例一:用/etc/pam.conf配置默认的认证方式。下面的例子将拒绝所有没有在/etc/pam.conf中明确配置的服务。OTHER代表没有明确配置的其它所有服务,pam_deny模块的作用只是简 单地拒绝通过认证。OTHER auth required /usr/lib/security/pam_deny.soOTHER account required /usr/lib/security/pam_deny.soOTHER password required /usr/lib/security/pam_deny.soOTHER session required /usr/lib/security/pam_deny.so例二:通过/etc/pam.d/rsh文件配置rsh服务的认证方式。rsh服务认证用户时,先使用/etc/hosts.equiv和.rhosts文件的认证方式,然后再根据/etc/nologin文件的存在与否来判断是否允许该用户使用 rsh,最后使用password database来认证用户。auth required /lib/security/pam_rhosts_auth.soauth required /lib/security/pam_nologin.soaccount required /lib/security/pam_pwdb.sosession required /lib/security/pam_pwdb.so例三:通过/etc/pam.conf配置ftpd的认证方式。下面是ftpd服务利用PAM模块进行用户认证的三个步骤。首先用pam_ftp模块检查当前用户是否为匿名用户,如果是匿名用户,则 sufficient控制标志表明无需再进行后面的认证步骤,直接通过认证;否则继续使用pam_unix_auth模块来进行标准的unix认证,即用/etc/ passwd和/etc/shadow进行认证;通过了pam_unix_auth模块的认证之后,还要继续用pam_listfile模块来检查该用户是否出现在文件/etc/ ftpusers中,如果是则该用户被deny掉。ftpd auth sufficient /usr/lib/security/pam_ftp.softpd auth required /usr/lib/security/pam_unix_auth.so use_first_passftpd auth required /usr/lib/security/pam_listfile.soonerr=succeed item=user sense=deny file=/etc/ftpusers五、密码映射(password-mapping)密码映射允许用户在不同的认证机制下使用不同的密码,其中有一个主密码(primary password),其它密码为次密码(secondary passwords,可能有多个)。主密码用来对次密码进行加密。在主密码认证通过后,认证模块利用主密码将加密过的次密码(也称为 mapped password)解密,并对次密码进行认证。注:如果使用了一次性密码的机制,就不使用密码映射。所有服务模块必须支持如下4个映射选项(在第四部分已经简单解释过):1、use_first_pass这个选项指示本模块不能提示用户输入密码,而是使用已有的密码,即从第一个向用户提示输入密码的模块那里取得密码,并对该密码进 行认证。2、try_first_pass这个选项指示本模块首先尝试使用已有的密码,即从第一个向用户提示输入密码的模块那里取得密码,并对该密码进行认证。如果密码认 证失败,则再提示用户输入密码。3、use_mapped_pass这个选项指示本模块不能向用户提示输入密码,而应使用映射过的密码,即利用主密码将加密过的次密码解密出来并进行认证。4、try_mapped_pass这个选项指示本模块首先尝试使用映射过的密码,即利用主密码将加密过的次密码解密出来并进行认证。如果密码认证失败,则再提示用 户输入密码。密码映射的例子:下面是/etc/pam.conf中关于login服务的配置。这里login共有3种认证机制:Kerberos、UNIX和RSA认证,两个required控制标志表明用户必 须通过Kerberos认证和UNIX认证才能使用login服务,optional选项则说明RSA认证是可选的。首先用户输入主密码进行Kerberos认 证;use_mapped_pass选项指示UNIX认证模块利用主密码将用于UNIX认证的次密码解密出来并对该次密码进行认证;try_first_pass选项 指示RSA认证模块先使用第一个模块(即Kerberos模块)的密码作为进行认证的密码,当对该密码认证失败时才提示用户输入用于RSA认 证的次密码。login auth required pam_kerb_auth.so debuglogin auth required pam_unix_auth.so use_mapped_passlogin auth optional pam_rsa_auth.so try_first_pass六、PAM API1、框架API:任何一个支持PAM的服务程序在进行认证时必须以pam_start( )开始进行初始化,最后以pam_end( )结束以便进行清理工作。2、认证管理API:pam_authenticate( )对用户名/密码进行认证。pam_setcred( )用来修改用户的秘密信息。3、帐户管理API:pam_acct_mgmt( )检查帐户本身是否有权限登录系统、帐户是否过期、帐户是否有登录时间限制等。4、密码管理API:pam_chauthtok( )修改用户的密码。5、会话管理API:一个会话以pam_open_session( )开始,最后以pam_close_session( )结束。6、其它:pam_get_item( )、pam_set_item( )用来读写PAM事务(transaction)的状态信息。pam_get_data( )、pam_set_data( )用来取得和设置PAM模块及会话的相关信息。pam_putenv( )、pam_getenv( )、pam_getenvlist( )用来读写环境变量。pam_strerror( )返回相关的错误信息。例子程序(摘自Sun的白皮书):下面的例子使用PAM API写了一个简单的login服务程序(注:这不是个完整的程序,所以省略了对pam_close_session的调用)。#include <security/pam_appl.h>/* 回调函数 */static int login_conv(int num_msg, struct pam_message **msg, struct pam_response**response, void *appdata_ptr);struct pam_conv pam_conv = {login_conv, NULL};pam_handle_t *pamh; /* 进行认证的PAM句柄 */void main(int argc, char *argv[], char **renvp){/* 初始化,并提供一个回调函数 */if ((pam_start("login", user_name, &pam_conv, &pamh)) != PAM_SUCCESS)login_exit(1);/* 设置一些参数 */pam_set_item(pamh, PAM_TTY, ttyn);pam_set_item(pamh, PAM_RHOST, remote_host);while (!authenticated && retry < MAX_RETRIES){status = pam_authenticate(pamh, 0); /* 密码认证管理,检查用户输入的密码是否正确 */authenticated = (status == PAM_SUCCESS);}if (status != PAM_SUCCESS){fprintf(stderr,"error: %s ", pam_strerror(pamh, status)); /* 显示错误原因 */login_exit(1);}/* 通过了密码认证之后再调用帐户管理API,检查用户帐号是否已经过期 */if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS){if (status == PAM_AUTHTOK_EXPIRED){status = pam_chauthtok(pamh, 0); /* 过期则要求用户更改密码 */if (status != PAM_SUCCESS)login_exit(1);}}/* 通过帐户管理检查之后则打开会话 */if (status = pam_open_session(pamh, 0) != PAM_SUCCESS)login_exit(status);/* 设置用户组 */setgid(pwd->pw_gid);/** Initialize the supplementary group access list before* pam_setcred because PAM modules might add groups* during the pam_setcred call*/initgroups(user_name, pwd->pw_gid);status = pam_setcred(pamh, PAM_ESTABLISH_CRED);if (status != PAM_SUCCESS)login_exit(status);/* 设置真实的用户ID(或者有效的用户ID)*/setuid(pwd->pw_uid);pam_end(pamh, PAM_SUCCESS); /* PAM事务的结束 *//*此处可用来实现与login有关的其它内容*/}/* 出错则清理现场并退出 */static void login_exit(int exit_code){if (pamh)pam_end(pamh, PAM_ABORT);exit(exit_code);}/* 这个回调函数被PAM认证模块调用以便显示错误信息或者或者用来取得用户输入,采用图形界面的服务程序则应使用图形界面来取得 用户输入或显示提示信息*/int login_conv(int num_msg, struct pam_message **msg, struct pam_response **response, void *appdata_ptr){while (num_msg--){switch (m->msg_style){case PAM_PROMPT_ECHO_OFF:r->resp = strdup(getpass(m->msg));break;case PAM_PROMPT_ECHO_ON:(void) fputs(m->msg, stdout);r->resp = malloc(PAM_MAX_RESP_SIZE);fgets(r->resp, PAM_MAX_RESP_SIZE, stdin);/* add code here to remove from fputs */break;case PAM_ERROR_MSG:(void) fputs(m->msg, stderr);break;case PAM_TEXT_INFO:(void) fputs(m->msg, stdout);break;default:log_error();break;}}return (PAM_SUCCESS);}七、PAM SPI当服务程序(ftpd、telnetd等)调用PAM API函数pam_xxx( )时,由PAM 框架(libpam)根据该服务在/etc/pam.conf文件中的配置调用指 定的PAM模块中对应的SPI函数pam_sm_xxx()。如下:API函数的名字为pam_xxx( ),对应的SPI函数的名字为pam_sm_xxx( ),即每个服务模块需要引出相应的函数以供libpam调用。为方便对 照,再列一下。API 对应的 SPI帐号管理 pam_acct_mgmt( ) pam_sm_acct_mgmt( )认证管理 pam_authenticate( ) pam_ sm_authenticate( )密码管理 pam_chauthtok( ) pam_ sm_chauthtok( )会话管理 pam_open_session( ) pam_ sm_open_session( )会话管理 pam_close_session( ) pam_ sm_close_session( )认证管理 pam_setcred( ) pam_ sm_setcred( )八、常用的PAM服务模块下面是Linux提供的PAM模块列表(只是其中一部分):模块文件 模块功能描述 相关配置文件pam_access 提供logdaemon风格的登录控制 /etc/security/access.confpam_chroot 提供类似chroot命令的功能pam_cracklib 对密码的强度进行一定的检查 库文件libcrack和字典文件/usr/lib/cracklib_dictpam_deny 总是无条件地使认证失败pam_env 设置或取消环境变量 /etc/security/pam_env.confpam_filter 对输入输出流进行过滤 filterspam_ftp.so 对匿名ftp用户进行认证pam_group 当用户在指定的终端上请求指定的 /etc/security/group.conf服务时赋予该用户相应的组权限pam_issue 在提示用户输入用户名之前显示 /etc/issue/etc/issue文件的内容pam_krb4 对用户密码进行Kerberos认证 相应的Kerberos库文件pam_lastlog 在用户登录成功后显示关于 /var/log/lastlog用户上次登录的信息,并维护/var/log/lastlog文件。pam_limits 限制用户会话所能使用的系统资源 /etc/security/limits.confpam_listfile 根据指定的某个文件决定是否 例如/etc/ftpusers允许或禁止提供服务pam_mail 检查用户的邮箱中是否有新邮件 /var/spool/mail/xxxxpam_mkhomedir 为用户建立主目录 /etc/skel/pam_motd 显示/etc/motd文件的内容 /etc/motdpam_nologin 根据/etc/nologin文件的存在与否 /etc/nologin来决定用户认证是否成功pam_permit 总是无条件地使认证成功pam_pwdb 作为pam_unix_xxxx模块的一个替代。/etc/pwdb.conf使用Password Database通用接口进行认证。pam_radius 提供远程身份验证拨入用户服务(RADIUS)的认证pam_rhosts_auth 利用文件~/.rhosts和 /etc/hosts.equiv和~/.rhosts/etc/hosts.equiv对用户进行认证。pam_rootok 检查用户是否为超级用户,如果是超级用户则无条件地通过认证。pam_securetty 提供标准的Unix securetty检查 /etc/securettypam_time 提供基于时间的控制,比如限制 /etc/security/time.conf用户只能在某个时间段内才能登录pam_unix 提供标准的Unix认证 /etc/passwd和 /etc/shadowpam_userdb 利用Berkeley DB数据库来检查 Berkeley DB用户/密码pam_warn 利用syslog( )记录一条告警信息pam_wheel 只允许wheel组的用户有超级用户的存取权限参考资料:1、DCE/OSF-RFC 86.02、Linux-PAM documentation & source code3、Sun Solaris PAM documentation... 全文

系统管理员 应用程序 配置文件 service 开发者

75个顶级开源安全应用(2)

 入侵检测34、Snort Snort号称是当今部署最广泛的入侵检测和防护系统,是IPS的事实标准。其开发商是Sourcefire,融合基于签名、协议和异常的检测于一体。操作系统:Linux、Unix和OS X。35、AFICK ... 全文

检测 操作系统 开发商 Linux 用户

几大网站使用的操作系统、Web服务器和开发语言

网站      操作系统  Web服务器        脚本语言PHPChina 开源社区门户1v... 全文

web服务 freebsd php apache linux debian

1