3.1. snmpd.conf 설정
패키지들을 인스톨했으면 먼저 SNMPD(에이젼트)설정 파일인 /etc/snmp/snmpd.conf를 편집해야 한다. SNMP 패키지를 인스톨 하면 snmpconf 명령이 들어 있어 SNMPD뿐만 아니라 SNMP(매니져), SNMPTRAP을 메뉴 방식으로 한번에 설정할 수가 있다. 그러나 SNMP를 잘 모르는 사람에게는 이 방법이 더 어려울수도 있다. 여기서는 SNMPD 설정파일을 직접 수정하는 방법으로 설명하겠다. 밑에 설정 파일에 주석으로 설명을 달아 놓았으니 설명을 보고 각자의 상황에 맞게 수정하여 사용하면 된다.
참고: SNMP에는 SNMP(매니저), SNMPD(에이젼트), SNMPTRAP 이렇게 3가지 종류가 있다. 보통 에이전트는 매니저가 일반 서버와 마찬가지로 클라이언트, 여기서는 매니저가 정보 요구해 올때에만 가진이 가지고 있는 정보를 보낸다. 그런데 SNMPTRAP는 매니져의 요구가 없어도 미리 에이전트에 설정된 어떤 특수한 이벤트 발생시 매니저에 먼저 신호를 보내는 것을 말한다.
snmpd.conf # 패키지 인스톨시 따라오는 설정 파일에서 필요없는 부분은 지우고 중요한 # 부분만 주석을 달아 놓았다. ############################################################################## # SNMP 보안에 관한 설정을 한다. # SNMP는 인증과 접근 방침을 정하는 낮은 단계의 보안을 제공한다. # 이부분은 SNMPv3에서 크게 향상 되었는데 여기서는 그냥 인증과 접근 방침 # 정의에 대해서만 설명을 하기로 하겠다. # -community # 인증, 접근 방침등의 특성을 정의하는 하나의 에이전트와 여러 매니져 사이의 # 관계이며 각 에이전트를 기준으로 정의된다. # 한 에이전트는 여러 community를 가질 수 있으나 각각의 이름은 그 에이젼트 # 내에서 유일하다 그러나 다른 에이전트가 같은 이름의 community를 가질 수는 # 있다. # 또한 community의 이름은 패스워드의 역할을 하므로 매니저로부터의 모든 # 메시지는 이 이름을 포함해야만 한다. # 관례적으로 모두에게 공개하는 MIB객체나, 동작에 대해서는 'public' # community를 사용하고, SET과 같이 쓰기 동작이나 private 한 MIB에 대해서는 # 비밀의 community를 지정하여 사용하는것이 일반적이다. # # -접근 방침 # 각각의 community마다 MIB에 대한 접근을 각각의 다른 형태의 권한으로 제어 # 할수 있다. # 이러한 접근 제어의 방법은 SNMP MIB의 관점(관리 객체들의 집합으로 각 # community마다 다른 SNMP MIB 관점을 가질 수 있음)에 의한 방법과 SNMP 접근 # 모드(각 community에 대한 접근 모드로 READ-ONLY나 READ-WRITE 중 한 값을 # 취할 수 있다)에 의한 방법으로 나뉠 수 있다. # 자세한 사항은 문서를 참조하기 바란다. # ############################################################################### ############################################################################### # Access Control ############################################################################### #### # First, map the community name (COMMUNITY) into a security name # (local and mynetwork, depending on where the request is coming # from): # community 에 정한 이름을 sec.name으로 맵핑한다. # sec.name과 아래서 설정하는 그룹, MIB 객체에 대한 제한을 합하여 실질적인 # 접근 권한을 주게 된다. # community pcharley는 로컬 호스트와 특정 아이피에서만 접근을 할 수 있으며 # community public은 특정 네트웍(내부 네트웍)에서만 접근 할 수 있도록 # 설정하는 예이다. # source는 snmpd로 접근할 주소를 지정한다. # sec.name source community com2sec private localhost pcharley com2sec private <IP_ADDRESS> pcharley com2sec paranoid <NETWORK>/24 public com2sec readonly <NETWORK>/24 public #### # Second, map the security names into group names: # security 모델에는 v1, v2c, usm가 있는데 자세한 사항은 snmp 서적을 # 참고하기 바란다. # 여기서는 위에서 지정한 sec.name을 특정 그룹으로 맵핑하여 접근 권한을 # 그룹별 제한하는데 사용한다 # 여기서는 sec.name private를 읽기,쓰기 권한을 가지게 될 MyRWGroup으로 # 맵핑을 하고, sec.name readonly는 읽기 권한을 가지게 될 MyROGroup으로 # 맵핑을 하며, sec.name paranoid는 MIB 객체의 system 부분만을 볼수 있게 될 # MyROSystem 그룹에 맵핑을 하고 있다. # sec.model sec.name group MyROSystem v1 paranoid group MyROSystem v2c paranoid group MyROSystem usm paranoid group MyRWGroup v1 private group MyRWGroup v2c private group MyRWGroup usm private group MyROGroup v1 readonly group MyROGroup v2c readonly group MyROGroup usm readonly #### # Third, create a view for us to let the groups have rights to: # 볼 수 있는 MIB 객체에 대한 제한을 정한다. # MIB 객체에 대한 자세한 사항 역시 기술 서적을 참고 하기 바란다. # all : 모든 MIB 객체를 나타낸다. # system : TCP/IP MIB 객체중 시스템에 관한 부분만을 말한다. # mib2 : TCP/IP MIB-II에 대한 기본 객체를 말한다. # incl/excl subtree mask view all included .1 80 view system included .iso.org.dod.internet.mgmt.mib-2.system view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc #### # Finally, grant the 2 groups access to the 1 view with different # write permissions: # 위에서 정한 권한 그룹과 MIB 객체에 대한 제한을 결합하여 실질적인 권한을 # 설정하는 곳이다. # MyRWGroup(pcharley)은 모든것에서 읽고 쓸수 있는 권한 있으며, MyROGroup, # MyROSystem(public)은 읽기 권한만이 주어진다. # 위에서 sec.name paranoid역시 community를 public으로 하였는데, sec.name # paranoid, readonly의 community를 차별화하여 시스템 MIB 정보를 제한 할 # 수가 있다. # sec.name paranoid의 경우에는 시스템에 관한 정보만을 읽기 권한으로 엑세스 # 할 수가 있다 # 이제 community pcharley는 읽기,쓰기 권한의 그룹에 속하며, community # public은 읽기 권한의 그룹에 속하게 된다. # context sec.model sec.level match read write notif access MyROSystem "" any noauth exact system none none access MyROGroup "" any noauth exact all none none access MyRWGroup "" any noauth exact all all none # ----------------------------------------------------------------------------- ############################################################################## # 이 밑부터 설정되는 부분은 예제로 나오는 snmpwalk 명령으로 MIB 값을 # 바꿔가며 확인해보기 바란다. # 그래야지 MIB 객체에 대해서 이해하기가 수월해질것이다. ############################################################################## ㅔ############################################################################### # System contact information # MIB 객체중 시스템에 관한 부분을 설정 # 위에서 설정한 접근 권한을 적용한다면 MyROSystem 그룹 권한으로는 밑에서 # 설정되는 시스템 정보만을 볼수가 있게 된다. # # It is also possible to set the sysContact and sysLocation system # variables through the snmpd.conf file: syslocation "Seoul, Korea" syscontact <이메일 어드레스> # Example output of snmpwalk: # % snmpwalk -v 1 localhost public system # system.sysDescr.0 = "SunOS name sun4c" # system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.sunos4 # system.sysUpTime.0 = Timeticks: (595637548) 68 days, 22:32:55 # system.sysContact.0 = "Me <me@somewhere.org>" # system.sysName.0 = "name" # system.sysLocation.0 = "Right here, right now." # system.sysServices.0 = 72 # ----------------------------------------------------------------------------- ############################################################################### # Process checks. # 모니터링하고 싶은 프로세스를 여기서 설정하여 외부에서 모니터링 할 수가 있다 # # The following are examples of how to use the agent to check for # processes running on the host. The syntax looks something like: # # proc NAME [MAX=0] [MIN=0] # # NAME: the name of the process to check for. It must match # exactly (ie, http will not find httpd processes). # MAX: the maximum number allowed to be running. Defaults to 0. # MIN: the minimum number to be running. Defaults to 0. # # Examples: # #proc apache #proc mysqld # Make sure mountd is running #proc mountd # Make sure there are no more than 4 ntalkds running, but 0 is ok too. #proc ntalkd 4 # Make sure at least one sendmail, but less than or equal to 10 are running. #proc sendmail 10 1 # A snmpwalk of the prTable would look something like this: # # % snmpwalk -v 1 localhost public .1.3.6.1.4.1.2021.2 # enterprises.ucdavis.procTable.prEntry.prIndex.1 = 1 # enterprises.ucdavis.procTable.prEntry.prIndex.2 = 2 # enterprises.ucdavis.procTable.prEntry.prIndex.3 = 3 # enterprises.ucdavis.procTable.prEntry.prNames.1 = "mountd" # enterprises.ucdavis.procTable.prEntry.prNames.2 = "ntalkd" # enterprises.ucdavis.procTable.prEntry.prNames.3 = "sendmail" # enterprises.ucdavis.procTable.prEntry.prMin.1 = 0 # enterprises.ucdavis.procTable.prEntry.prMin.2 = 0 # enterprises.ucdavis.procTable.prEntry.prMin.3 = 1 # enterprises.ucdavis.procTable.prEntry.prMax.1 = 0 # enterprises.ucdavis.procTable.prEntry.prMax.2 = 4 # enterprises.ucdavis.procTable.prEntry.prMax.3 = 10 # enterprises.ucdavis.procTable.prEntry.prCount.1 = 0 # enterprises.ucdavis.procTable.prEntry.prCount.2 = 0 # enterprises.ucdavis.procTable.prEntry.prCount.3 = 1 # enterprises.ucdavis.procTable.prEntry.prErrorFlag.1 = 1 # enterprises.ucdavis.procTable.prEntry.prErrorFlag.2 = 0 # enterprises.ucdavis.procTable.prEntry.prErrorFlag.3 = 0 # enterprises.ucdavis.procTable.prEntry.prErrMessage.1 = "No mountd process running." # enterprises.ucdavis.procTable.prEntry.prErrMessage.2 = "" # enterprises.ucdavis.procTable.prEntry.prErrMessage.3 = "" # enterprises.ucdavis.procTable.prEntry.prErrFix.1 = 0 # enterprises.ucdavis.procTable.prEntry.prErrFix.2 = 0 # enterprises.ucdavis.procTable.prEntry.prErrFix.3 = 0 # # Note that the errorFlag for mountd is set to 1 because one is not # running (in this case an rpc.mountd is, but thats not good enough), # and the ErrMessage tells you what's wrong. The configuration # imposed in the snmpd.conf file is also shown. # # Special Case: When the min and max numbers are both 0, it assumes # you want a max of infinity and a min of 1. # # ----------------------------------------------------------------------------- ############################################################################### # Executables/scripts # 쉘 스크립트를 이곳에 등록하여 그 결과를 모니터링 할 수가 있다. # 여기서 예제로 설명하는 mrtg.cfg 를 보면 Target[mrtg_tab] 소스에 직접 쉘 # 스크립트를 지정하여 로컬 머신 web server, mysql server의 데몬과 세션을 # 모니터링 하는데, 밑에서처럼 두 쉘 스크립트를 이곳에 등록하여 모니터링 할 # 수도 있다. # 이렇게 모니터링 하게 되면 쉘 스크립트의 결과가 MIB 객체로 등록이 되므로 # 원격 mrtg 머신에서도 이 쉘 스크립트를 모니터링 할 수 있는 장점이 있다. # 그러나 이곳에 쉘 스크립트를 등록하여 이용하는 방법은 보안 문제를 유발 할 # 수 있음을 인지하여 주의 깊게 사용하기 바란다. # 또한 이 방법의 경우에는 쉘 스크립트 결과가 1라인을 초과 한다면 그 결과는 # 짤려지게 된다. # 이 문제에 대한 해결 방법은 밑에 적어 놓았다 # exec web_monitor /bin/sh /usr/local/bin/web_count.sh exec mysql_monitor /bin/sh /usr/local/bin/mysql_count.sh # You can also have programs run by the agent that return a single # line of output and an exit code. Here are two examples. # # exec NAME PROGRAM [ARGS ...] # # NAME: A generic name. # PROGRAM: The program to run. Include the path! # ARGS: optional arguments to be passed to the program # a simple hello world exec echotest /bin/echo hello world # Run a shell script containing: # # #!/bin/sh # echo hello world # echo hi there # exit 35 # # Note: this has been specifically commented out to prevent # accidental security holes due to someone else on your system writing # a /tmp/shtest before you do. Uncomment to use it. # #exec shelltest /bin/sh /tmp/shtest # Then, # % snmpwalk -v 1 localhost public .1.3.6.1.4.1.2021.8 # enterprises.ucdavis.extTable.extEntry.extIndex.1 = 1 # enterprises.ucdavis.extTable.extEntry.extIndex.2 = 2 # enterprises.ucdavis.extTable.extEntry.extNames.1 = "echotest" # enterprises.ucdavis.extTable.extEntry.extNames.2 = "shelltest" # enterprises.ucdavis.extTable.extEntry.extCommand.1 = "/bin/echo hello world" # enterprises.ucdavis.extTable.extEntry.extCommand.2 = "/bin/sh /tmp/shtest" # enterprises.ucdavis.extTable.extEntry.extResult.1 = 0 # enterprises.ucdavis.extTable.extEntry.extResult.2 = 35 # enterprises.ucdavis.extTable.extEntry.extOutput.1 = "hello world." # enterprises.ucdavis.extTable.extEntry.extOutput.2 = "hello world." # enterprises.ucdavis.extTable.extEntry.extErrFix.1 = 0 # enterprises.ucdavis.extTable.extEntry.extErrFix.2 = 0 # Note that the second line of the /tmp/shtest shell script is cut # off. Also note that the exit status of 35 was returned. # ----------------------------------------------------------------------------- ############################################################################### # disk checks # 디스크의 양을 모니터링 할 수 있다. # 사용 형식 'disk PATH [MIN=VALUE]' 형식으로 사용한다. # MIN에 지정된 수치 이하로 디스크 용량이 떨어지면 MIB에 errorFlag를 # 셋팅한다. # The agent can check the amount of available disk space, and make # sure it is above a set limit. # disk PATH [MIN=DEFDISKMINIMUMSPACE] # # PATH: mount path to the disk in question. # MIN: Disks with space below this value will have the Mib's errorFlag set. # Default value = DEFDISKMINIMUMSPACE. # Check the / partition and make sure it contains at least 10 megs. # 만약 여러개의 파티션으로 시스템을 구성하였다면 밑에다 설정을 해주어야 한다. disk / 10% # % snmpwalk -v 1 localhost public .1.3.6.1.4.1.2021.9 # enterprises.ucdavis.diskTable.dskEntry.diskIndex.1 = 0 # enterprises.ucdavis.diskTable.dskEntry.diskPath.1 = "/" Hex: 2F # enterprises.ucdavis.diskTable.dskEntry.diskDevice.1 = "/dev/dsk/c201d6s0" # enterprises.ucdavis.diskTable.dskEntry.diskMinimum.1 = 10000 # enterprises.ucdavis.diskTable.dskEntry.diskTotal.1 = 837130 # enterprises.ucdavis.diskTable.dskEntry.diskAvail.1 = 316325 # enterprises.ucdavis.diskTable.dskEntry.diskUsed.1 = 437092 # enterprises.ucdavis.diskTable.dskEntry.diskPercent.1 = 58 # enterprises.ucdavis.diskTable.dskEntry.diskErrorFlag.1 = 0 # enterprises.ucdavis.diskTable.dskEntry.diskErrorMsg.1 = "" # ----------------------------------------------------------------------------- ############################################################################### # load average checks # 시스템 로드를 모니터링하기 위해 # load [1MAX=DEFMAXLOADAVE] [5MAX=DEFMAXLOADAVE] [15MAX=DEFMAXLOADAVE] # # 1MAX: If the 1 minute load average is above this limit at query # time, the errorFlag will be set. # 5MAX: Similar, but for 5 min average. # 15MAX: Similar, but for 15 min average. # Check for loads: load 12 14 14 # % snmpwalk -v 1 localhost public .1.3.6.1.4.1.2021.10 # enterprises.ucdavis.loadTable.laEntry.loadaveIndex.1 = 1 # enterprises.ucdavis.loadTable.laEntry.loadaveIndex.2 = 2 # enterprises.ucdavis.loadTable.laEntry.loadaveIndex.3 = 3 # enterprises.ucdavis.loadTable.laEntry.loadaveNames.1 = "Load-1" # enterprises.ucdavis.loadTable.laEntry.loadaveNames.2 = "Load-5" # enterprises.ucdavis.loadTable.laEntry.loadaveNames.3 = "Load-15" # enterprises.ucdavis.loadTable.laEntry.loadaveLoad.1 = "0.49" Hex: 30 2E 34 39 # enterprises.ucdavis.loadTable.laEntry.loadaveLoad.2 = "0.31" Hex: 30 2E 33 31 # enterprises.ucdavis.loadTable.laEntry.loadaveLoad.3 = "0.26" Hex: 30 2E 32 36 # enterprises.ucdavis.loadTable.laEntry.loadaveConfig.1 = "12.00" # enterprises.ucdavis.loadTable.laEntry.loadaveConfig.2 = "14.00" # enterprises.ucdavis.loadTable.laEntry.loadaveConfig.3 = "14.00" # enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.1 = 0 # enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.2 = 0 # enterprises.ucdavis.loadTable.laEntry.loadaveErrorFlag.3 = 0 # enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.1 = "" # enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.2 = "" # enterprises.ucdavis.loadTable.laEntry.loadaveErrMessage.3 = "" # ----------------------------------------------------------------------------- # Run a shell script containing: # 위에서 쉘 스크립트를 등록하여 사용할 경우 결과가 1라인을 넘어갈 경우 짤려 나가는 # 문제를 해결하기 위한 방법이다. # #!/bin/sh # echo hello world # echo hi there # exit 35 # # Note: this has been specifically commented out to prevent # accidental security holes due to someone else on your system writing # a /tmp/shtest before you do. Uncomment to use it. # # exec .1.3.6.1.4.1.2021.50 shelltest /bin/sh /tmp/shtest exec .1.3.6.1.4.1.2021.50 web_monitor /bin/sh /usr/local/bin/web_count.sh exec .1.3.6.1.4.1.2021.51 mysql_monitor /bin/sh /usr/local/bin/mysql_count.sh # % snmpwalk -v 1 localhost public .1.3.6.1.4.1.2021.50 # enterprises.ucdavis.50.1.1 = 1 # enterprises.ucdavis.50.2.1 = "shelltest" # enterprises.ucdavis.50.3.1 = "/bin/sh /tmp/shtest" # enterprises.ucdavis.50.100.1 = 35 # enterprises.ucdavis.50.101.1 = "hello world." # enterprises.ucdavis.50.101.2 = "hi there." # enterprises.ucdavis.50.102.1 = 0 # Now the Output has grown to two lines, and we can see the 'hi # there.' output as the second line from our shell script. # # Note that you must alter the mib.txt file to be correct if you want # the .50.* outputs above to change to reasonable text descriptions. # Other ideas: # # exec .1.3.6.1.4.1.2021.51 ps /bin/ps # exec .1.3.6.1.4.1.2021.52 top /usr/local/bin/top # exec .1.3.6.1.4.1.2021.53 mailq /usr/bin/mailq -------------------------------------------------------------------------------- |
위 예제에서 snmpwalk 명령들은 꼭 직접을 실행해서 MIB객체에 대해 이해를 하기 바란다. 위 설정과 틀리게 설정할 경우 MIB의 정확한 값을 snmpwalk로 확인하는것이 좋다. snmpd.conf 파일을 설정하였다면 /etc/init.d/snmpd restart로 데몬을 다시 시작한다